根据题意描述,知道状态的转移跟次数m和n有关,初步建立二维dp
读过题意之后dp[ i ][ j ]表示传了j次后到达i的方法数;
因为是个圆形,对于最后一个和第一个判定一下;
初始化dp[ 1 ][ 0 ]=1;
根据状态转移方程,dp[ i ][ j ]=dp[ i-1 ][ j-1 ] + dp[ i+1 ][ j-1 ];
所以在第i个传球j次时,其余数j-1这个状态一定已经计算过;所以外层循环为1~m;
#include<bits/stdc++.h> using namespace std; const int maxn=100; int n,m,dp[maxn][maxn]; int main() { cin>>n>>m; dp[1][0]=1; if(m==1) cout<<0<<endl; else{ for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(j==1) dp[j][i]=dp[j+1][i-1]+dp[n][i-1]; else if(j==n) dp[j][i]=dp[j-1][i-1]+dp[1][i-1]; else{ dp[j][i]=dp[j-1][i-1]+dp[j+1][i-1]; } } } cout<<dp[1][m]<<endl; } }