问题: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]);
}