洛谷【P1057】傳球遊戲
阿新 • • 發佈:2019-01-13
https://www.luogu.org/problemnew/show/P1057
題目描述
在體育課上,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的:n 個同學站成一個圓圈,其中的一個同學手裡拿著一個球。當老師吹哨子時同學們開始傳球,每個同學可以把球傳給自己左右兩個同學中的一個。當老師再次吹哨子時,傳球停止,這時拿著球的同學就要給大家表演一個節目。
聰明的小蠻同學提出了一個問題:有多少種不同的傳球方法使得從小蠻手中開始傳的球在傳了 m 次之後又回到小蠻手中呢?
輸入輸出格式
輸入格式:
一行,有兩個空格隔開的整數 n, m ( 3 ≤ n ≤ 30, 1 ≤ m ≤ 30).
輸出格式:
一個整數,表示符合題意的方法數。
輸入輸出樣例
輸入樣例:
3 3
輸出樣例:
2
解題思路
-
狀態轉移方程
設 f [ i ][ j ] 為第 j 次傳球傳給第 i 名同學的方法數,有 f [ i ][ j ] = f [ i - 1 ][ j - 1 ] + f [ i + 1 ][ j - 1 ].
實現
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 int n, m;6 int dp[31][31]; 7 8 9 int main() 10 { 11 scanf("%d%d", &n, &m); 12 dp[1][0] = 1; 13 for (int i = 1; i <= m; ++i) { 14 dp[1][i] = dp[n][i - 1] + dp[2][i - 1]; 15 for (int j = 2; j < n; ++j) 16 dp[j][i] = dp[j - 1][i - 1] + dp[j + 1][i - 1];17 dp[n][i] = dp[n - 1][i - 1] + dp[1][i - 1]; 18 } 19 printf("%d\n", dp[1][m]); 20 return 0; 21 }