一、题目
二、思路
这道题比较容易想到,初始化一个二维数组dp[m][n],表示传球第m次传到n同学手里的方案数,这道题需要注意二维数组的一个初始化,传球0次,只能传到1手里,传球1一次,只能传到n或者2同学手里,同时需要注意传球是一个圆圈,可以向左向右传球,所以状态转移方程是:
当j==1时,dp[i][j]=dp[i-1][n]+dp[i-1][2];
当j==n时,dp[i[j]=dp[i-1][1]+dp[i-1][n-1];
其他的时候:dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];
三、代码
#include <bits/stdc++.h>
using namespace std;
const int N=35;
int num[N];
int dp[N][N];
int n,m;
int main()
{
cin>>n>>m;
dp[0][1]=1;
for(int i=2;i<=n;i++) dp[0][i]=0;
for(int i=1;i<=n;i++){
if(i==n||i==2) dp[1][i]=1;
else dp[1][i]=0;
}
for(int i=2;i<=m;i++){
for(int j=1;j<=n;j++){
if(j==n){
if(dp[i-1][n-1]!=0&&dp[i-1][1]!=0){
dp[i][j]=max(dp[i-1][n-1],dp[i-1][1])+1;
}
else dp[i][j]=max(dp[i-1][n-1],dp[i-1][1]);
}
else if(j==1){
if(dp[i-1][n]!=0&&dp[i-1][2]!=0){
dp[i][j]=max(dp[i-1][n],dp[i-1][2])+1;
}
else dp[i][j]=max(dp[i-1][n],dp[i-1][j+1]);
}
else {
if(dp[i-1][j-1]!=0&&dp[i-1][j+1]!=0){
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j+1])+1;
}
else dp[i][j]=max(dp[i-1][j-1],dp[i-1][j+1]);
}
}
}
cout<<dp[m][1];
return 0;
}