题目解析
关键:某时刻一个小朋友只能从左右两边接球
设dp[i][j]:传i次球到了第j个小朋友手里
两个边界情况:当j+1>n,可转化为(j+1)%n;当j-1<0,可转化为(j-1+n)%n
状态转移方程:dp[i][j]=dp[i-1][(j+1)%n]+dp[i-1][(j-1+n)%n]
目标:dp[m][0] (注意:这里的小朋友从0开始)
C++ 代码
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
const int N=35;
int dp[N][N];
int main(){
cin>>n>>m;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=m;i++){
for(int j=0;j<n;j++){
dp[i][j]=dp[i-1][(j+1)%n]+dp[i-1][(j-1+n)%n];
}
}
cout<<dp[m][0];
return 0;
}