问题:n个人围成一个圈,从第一个人传球m次,每次能传给相邻的人,问有多少种方法经过m次传回给第一个人。
思考:在第m次的时候传至第一个人手里,那么在m-1次的时候在第二个人或最后一个人手里。
用dp[i][j]表示第j次传球,传到第i个人手里的情况有多少种。
从而得到状态转移方程:dp[i][j]=dp[i-1][j-1]+dp[i+1][j-1](若i==1,则i-1改为n;若i==n,则i+1改为1)
从而问题得到求解。
#include <bits/stdc++.h> using namespace std; int dp[33][33]; int main() { int n,m; scanf("%d %d",&n,&m); dp[1][0]=1; for(int j=1;j<=m;j++) for(int i=1;i<=n;i++) { if(i==1) dp[i][j]=dp[n][j-1]+dp[i+1][j-1]; else if(i==n) dp[i][j]=dp[i-1][j-1]+dp[1][j-1]; else dp[i][j]=dp[i-1][j-1]+dp[i+1][j-1]; } printf("%d\n",dp[1][m]); }