計蒜客習題 蒜頭君的新遊戲

2021-09-12 07:05:34 字數 1063 閱讀 5886

工作空閒之餘,蒜頭君經常帶著同事們做遊戲,最近蒜頭君發明了乙個好玩的新遊戲:n 位同事圍成乙個圈,同事 a 手裡拿著乙個兔妮妮的娃娃。蒜頭君喊遊戲開始,每位手裡拿著娃娃的同事可以選擇將娃娃傳給左邊或者右邊的同學,當蒜頭君喊遊戲結束時,停止傳娃娃。此時手裡拿著娃娃的同事即是敗者。

玩了幾輪之後,蒜頭君想到乙個問題:有多少種不同的方法,使得從同事 a 開始傳娃娃,傳了 m 次之後又回到了同事 a 手裡。兩種方法,如果接娃娃的同事不同,或者接娃娃的順序不同均視為不同的方法。例如1−>2−>3−>1 和 1->3->2->1 是兩種不同的方法。

輸入格式

輸入一行,輸入兩個整數n,m(3≤n≤30,1≤m≤30),表示一共有 n 位同事一起遊戲,一共傳 m 次娃娃。

輸出格式

輸出一行,輸出乙個整數,表示一共有多少種不同的傳娃娃方法。

樣例輸入

3 3樣例輸出

2分析:

這個是乙個dp題目,我們可以建立乙個二維陣列,第一維表示次數,第二維表示人數。

dp[i][j]就表示第i次傳到第j個人的手裡的可能性。

由於能傳給dp[i][j]的位置只能有dp[i-1][j-1]+dp[i-1][j+1],這兩種可能性,所以遞推式就是這個,然後因為是乙個環,所以要注意邊界的處理。

即:dp[i][1]=dp[i-1][2]+dp[i-1][n]

dp[i][n]=dp[i-1][n-1]+dp[i-1][1]

然後整個dp陣列初始化為0。dp[0][1]=1;

ac**:

#include"stdio.h"

#include"string.h"

#include"algorithm"

using namespace std;

int main()

else

if(j==n)

dp[i][j]=dp[i-1][j-1]+dp[i-1][1];

else

dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];}}

printf("%d\n",dp[m][1]);

}

蒜頭君的新遊戲 計蒜客

目錄 題目 題解 工作空閒之餘,蒜頭君經常帶著同事們做遊戲,最近蒜頭君發明了乙個好玩的新遊戲 n 位同事圍成乙個圈,同事 a 手裡拿著乙個兔妮妮的娃娃。蒜頭君喊遊戲開始,每位手裡拿著娃娃的同事可以選擇將娃娃傳給左邊或者右邊的同學,當蒜頭君喊遊戲結束時,停止傳娃娃。此時手裡拿著娃娃的同事即是敗者。玩了...

計蒜客習題 蒜頭君倒水

推出轉移矩陣 1 xyx1 y begin 1 x y x 1 y end 1 xx y1 y 之後的就很顯然了 倒了幾次就是求轉移矩陣的幾次冪 然後乘上原矩陣 ab begin a b end ab 即可 傳送門注意矩陣乘法不滿足交換律 includeusing namespace std dou...

計蒜客習題 蒜頭君的積木

問題描述 蒜頭君酷愛搭積木,他用積木搭了 n 輛重量為 wi的小車和一艘最大載重量為 w 的小船,他想用這艘小船將 n 輛小車運輸過河。每次小船運載的小車重量不能超過 w。另外,小船在運載小車時,每輛小車會對小船有乙個損壞值si,當多輛小車一起運載時,該趟運載對小船的損壞值為船上所有小車的最大損壞值...