日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ACM 博弈专题(5种模板)

發布時間:2025/3/11 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACM 博弈专题(5种模板) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近算法課在學博弈論的知識,順手把算法題中的涉及到博弈論一并總結了
這篇文章的有些內容是參考了大佬的
可能有遺漏。。。。
(一)巴什博弈(BAsh Game)

題目模板

  • 只有一堆n個物品
  • 兩個人輪流取,每次只能取1~m個物品,誰先取完,誰勝利;(n,m是輸入的隨機數)

解題思路

  • 當 n = m + 1 時 第一個取的人不可能獲勝;
  • ?當 n = k*(m + 1) + r 時 ? ? ? ? ? (k,r,s都是未知的整數)

  • ?當 n = k*(m + 1) + r 時 (k,r,s都是未知的整數)

    ?先取者拿走 r 個,那么后者再拿(1~m)個

    ? 此時 n =(k-1)*(m+1)+s

    ?先取者再拿走s 個 最后總能造成 剩下n=k*(m+1) 的局面

    ?若n=k*(m+1) 那么先取者必輸

    若n=k*(m+1) 那么先取者必輸

    求解巴什博弈函數

  • int Bash_Game(int n,int m)//是否先手有必贏策略
  • {
  • if (n%(m+1)!=0)
  • return 1;
  • return 0;
  • }
  • 樣題:HDU 2147 kiki's game? ? ? ? ? ??HDU 2149 Public Sale? ? ? ? ??HDU 1846 Brave Game?? ? ??HDU 2188 悼念512汶川大地震遇難同胞——選拔志愿者

    ?

    ?

    (二)威佐夫博奕(Wythoff's game)

    題目模板

    • 有兩堆各若干個
    • 兩個人輪流從某堆或同時從兩堆取同樣多的物品
    • 規定每次至少取一個,多者不限,最后取光的人勝利

    解題思路

    • 兩堆石子的狀態為 [a,b] (滿足a<=b)
    • 當 a=(k*(√5+1)/2), b=a+k 時滿足奇異局勢,那么則先手輸,反之則先手贏

    求解威佐夫博奕函數

  • int Wythoff_Game(int a,int b)//b要大于a
  • {
  • double x=(1+sqrt(5))/2;
  • int n=b-a;
  • if(a==(int)(x*n))
  • return 1;
  • return 0;
  • }
  • 樣題:HDU 1527 取石子游戲?? ? ? ? ??HDU 2177 取(2堆)石子游戲

    ?

    ?

    (三) 尼姆博奕(Nimm's Game)

    題目模板

    • 有多堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取一個,多者不限,最后取光者得勝。

    解題思路

    • 用0與每個數異或,如最后結果為0,則后手勝

    • 設一數組a[n][m],令sum=0

    • 循環與數組每一個數據異或(sum^=a[i][j])

    • ?sum最后等于0則后手勝

    ???????求解尼姆博弈函數

    a[m]每堆物品的數量? sum=0

  • int Nimm_Game(int n,int m)//n堆物品,m個物品
  • {
  • for(int i=0;i<n;i++)
  • for(int j=0;j<m;j++)
  • sum = sum ^ a[i][j];
  • if(sum == 0)
  • return 0;
  • return 1;
  • }
  • 樣題:HDU 1850 Being a Good Boy in Spring Festival

    ? ? ? ? ? ?HUD 1907 John?? ? ? ?HDU 2509 Be the Winner

    ? ? ? ? ? ?HDU 1849 Rabbit and Grass

    ?

    ?

    (四) 斐波那契博弈

    題目模板

    • 有一堆個數為n的石子,游戲雙方輪流取石子,
    • 滿足:
    • 先手不能在第一次把所有的石子取完;
    • 之后每次可以取的石子數介于1到對手剛取的石子數的2倍之間(包含1和對手剛取的石子數的2倍)

    求解斐波那契博弈函數 f[50]

  • int Fib_Game(int n)
  • {
  • f[1]=1;f[2]=1;
  • for(int i=3;i<=50;i++)
  • f[i] = f[i-1] + f[i-2];
  • if( 數組f 中包含 n )
  • return 1;//先手贏
  • return 0;
  • }
  • 樣題:HDU 2516 取石子游戲

    ?

    ?

    (五) 環形博弈

    題目模板

    • n個石子圍成一個環,每次取一個或者取相鄰的2個(每個石子有序號)

    ???????求解

    • 石子數<=2先手贏,否則后手贏

    總結

    以上是生活随笔為你收集整理的ACM 博弈专题(5种模板)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。