工作空閒之餘,蒜頭君經常帶著同事們做遊戲,最近蒜頭君發明了乙個好玩的新遊戲: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,當多輛小車一起運載時,該趟運載對小船的損壞值為船上所有小車的最大損壞值...