P1057 传球游戏
题意:给出n个人,要进行传球,球一开始在第一个人手中,可以传m次
问,经过m次传球回到1这个位置的方案数;
思路:本题,我们可以用dp的方式来解;
题目给出n m的数据范围在30这里,
那么如何枚举能过满足dp的性质呢?
我们可以枚举传球次数,第2次传球不会影响第一次,第三次传球不会影响第二次;
于是,我们可以枚举第k次到达某个位置的方案数;
即dp【i】【j】:表示第i次传球,球在j这个人的时候的方案数
这样子枚举即可;
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=50; 4 int dp[maxn][maxn]; //第一维表示几次传球,第二维表示位置; 5 int main() 6 { 7 int n,m; 8 scanf("%d%d",&n,&m); 9 dp[0][1]=1; 10 for(int i=1;i<=m;i++) 11 for(int j=1;j<=n;j++){ 12 if(j==1) dp[i][j]=dp[i-1][j+1]+dp[i-1][n]; 13 else if(j==n) dp[i][j]=dp[i-1][j-1]+dp[i-1][1]; 14 else dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]; 15 } 16 printf("%d\n",dp[m][1]); 17 return 0; 18 }