思路
这道题主要难点是如何设置动态转移方程的转移方式。
既然是传球,我们不妨设 f [ i ] [ j ] f[i][j] f[i][j] 表示传第 i i i 次球时传到第 j j j 个人手上。
此时动态转移方程就变得异常好推:
当 i = 0 i=0 i=0 时球还在小蛮手上,所以 f [ 0 ] [ 1 ] = 1 f[0][1]=1 f[0][1]=1。
当 j = n j=n j=n 时球只会从 1 1 1 号人和 n − 1 n-1 n−1 号人传来。
其余情况时球就只会从 j − 1 j-1 j−1 和 j + 1 j+1 j+1 号人传来。
最终得到动态转移方程(3个)
C o d e Code Code
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long f[101][101];
long long n,m;
int main()
{
cin>>n>>m;
f[0][1]=1;
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
{
if(j==1)
f[i][j]=f[i-1][2]+f[i-1][n];
if(j>1&&j!=n)
f[i][j]=f[i][j]+f[i-1][j-1]+f[i-1][j+1];
if(j==n)
f[i][j]=f[i-1][1]+f[i-1][n-1];
}
cout<<f[m][1];
return 0;
}