1. 程式人生 > >洛谷【P1057】傳球遊戲

洛谷【P1057】傳球遊戲

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 }