似乎該博弈了!(動態規劃)

2022-02-18 01:32:20 字數 1274 閱讀 5920

nova君陷入了困境,因為他無法在ps4遊戲上憑藉操作戰勝對手。機智如他,只好和對手博弈了!

nova君拿出的方案和以往有些不一樣,他說:「你可以決定石子數量和石子的取法,我來決定先後手,這樣非常公平。」他的對手覺得nova君說的有道理,於是不僅決定了每局的石子數量,還給出了k個數字,表示每次可以任意取走數量等同於這k個數字中乙個的石子,k中一定有乙個為1。先取完者為勝。

現在很急很關鍵,快幫nova君看看他到底應該先手還是後手才能戰勝對手。

每組測試資料兩行。

第一行兩個整數n和k,第二行k個整數,意義如題目描述。

n<=100000,k<=15

對於每組資料,輸出一行,為nova應該採取的先後手 sente \ gote

4 3

1 2 3

1 11

gote

sente

解題思路:給定n個石頭,和k種去除石頭的方式,每種方式可以去除一定量的石頭, 現在sente(簡稱s),gote(簡稱o),s先手,o後手,每次每個人能選擇一種去除石頭的方式,誰去除最後一堆誰就贏了。要求出必勝之人是誰。

分析:1.用乙個dp陣列記錄,對於先手者能取到的記錄為1,後手者為0.

2.初始dp陣列都為0,遍歷1到n,如果dp[i]為0,說明上一手是後手取得,這樣先手就能取,把dp[i]變為1,由於是從1到n,這樣每個狀態記錄時,前面的都已經記錄好了,所以是可行的.

3.這樣最後只需要判斷dp[n]是1,還是0,就可以判斷是先手勝還是後手勝了。

狀態轉移方程為:if (i - mjmj[j] >= 0 && !dp[i - mjmj[j]])  dp[i] = 1.

給出**:

1 #include 2

#define max 1000010

3int dp[max],mjmj[15];4

5int

n,m,i,j;

6int

main()716

for (i=1;i<=n;++i)

1725}26

}27if(dp[n])

28 printf("

sente\n");

29else

30 printf("

gote\n");

31}32return0;

33 }

推薦部落格:

推薦部落格:

動態規劃 除數博弈

愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字 n 在每個玩家的回合,玩家需要執行以下操作 選出任一 x,滿足 0 x n 且 n x 0 用 n x 替換黑板上的數字 n 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回 true,否則返回...

動態規劃 1025 除數博弈

難度easy 愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字 n 在每個玩家的回合,玩家需要執行以下操作 選出任一 x,滿足 0 x n 且 n x 0 用 n x 替換黑板上的數字 n 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回 tr...

動態規劃系列 1025 除數博弈

package test 動態規劃系列 1025.除數博弈 愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字 n 在每個玩家的回合,玩家需要執行以下操作 選出任一 x,滿足 0 x n 且 n x 0 用 n x 替換黑板上的數字 n 如果玩家無法執行這些操作,就會輸掉遊...