一道非常简单的DP题
状态:f[i][j]表示传了i次球,传到了第j个人的手中的方案数
状态转移方程:f[i][j]=f[i-1][j-1]+f[i-1][j+1];
特别的,对于j==n的情况下,因为做游戏时候小朋友排成的是一个环,所以此时与n相邻的节点是n-1和1,对于j==1的情况下,与1相邻的节点是n和2
状态转移方程的解释:
传了i次球,传到了第j个人的手中的方案数就等于传了i-1次球,分别到j-1和j+1两个与j相邻的点上,再传一次,则到达j,所以f[i][j]=f[i-1][j-1]+f[i-1][j+1]
最后附上代码
#include<bits/stdc++.h> using namespace std; int n,m,f[50][50]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ f[0][i]=1; } for(int i=0;i<=n;i++){ f[0][i]=0; } f[0][1]=1; for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ int t1=j-1,t2=j+1; if(j==n){ t2=1; } if(j==1){ t1=n; } f[i][j]=f[i-1][t1]+f[i-1][t2]; } } printf("%d",f[m][1]); return 0; }