題目描述:
上體育課的時候,小蠻的老師經常帶着同學們一起做遊戲。這次,老師帶着同學們一起做傳球遊戲。
遊戲規則是這樣的:n個同學站成一個圓圈,其中的一個同學手裏拿着一個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的一個(左右任意),當老師再次吹哨子時,傳球停止,此時,拿着球沒傳出去的那個同學就是敗者,要給大家表演一個節目。
聰明的小蠻提出一個有趣的問題:有多少種不同的傳球方法可以使得從小蠻手裏開始傳的球,傳了m次以後,又回到小蠻手裏。兩種傳球的方法被視作不同的方法,當且僅當這兩種方法中,接到球的同學按接球順序組成的序列是不同的。比如有3個同學1號、2號、3號,並假設小蠻爲1號,球傳了3次回到小蠻手裏的方式有1->2->3->1和1->3->2->1,共2種。
大致思路:
傳球到自己手中只有兩種可能性,就是從第i+1人手中或i-1手中傳到自己手中,得到狀態轉移方程:f[i][j] = f[i-1][j-1]+f[i+1][j-1]。
代碼:
#include <iostream>
#include <cstring>
using namespace std;
int n,m,ans[35][35];
int main() {
cin>>n>>m;
memset(ans,0,sizeof(ans));
ans[1][0] = 1;
for (int i = 1; i<=m; i++) {
ans[1][i] = ans[2][i-1]+ans[n][i-1];
ans[n][i] = ans[n-1][i-1]+ans[1][i-1];
for (int j = 2; j<n; j++)
ans[j][i] = ans[j-1][i-1]+ans[j+1][i-1];
}
cout<<ans[1][m]<<endl;
}