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 }

 

posted @ 2020-03-23 15:08  古比  阅读(230)  评论(0编辑  收藏  举报