洛谷传球游戏

题目链接:https://www.luogu.com.cn/problem/P1057;

蛮有意思的一道题;

题目大意是我们可以传球的时候可以向相邻的两个人传球,那么求在n个人m次传球的情况下最后回到传球人手里的方案数;

第一步:

我们可以这样设状态方程dp[i][j]表示传了i次回到第j个人手里的方案数;

第二步:

找转移方程

可以模拟一下,以n=5,m=6为例进行一下模拟,我们可以发现,除了开始的情况和最后的情况需要特殊处理以外,别的情况无外乎传到左边人的可能+传到右边人的可能,即dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];

所以就好处理了

代码即注意事项如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 int dp[50][50];//表示传了i次回到第j个人手里的方案数 
 5 int main()
 6 {
 7     ios::sync_with_stdio(false);
 8     cin>>n>>m;
 9     dp[0][1]=1;//初始情况,当第一个人不传球的时候就是一种方案,即不传 
10     for(register int i=1;i<=m;i++)
11     {
12         for(register int j=1;j<=n;j++)
13         {
14             if(j==1)//初始情况之后 ,即第一个人 
15             dp[i][j]=dp[i-1][n]+dp[i-1][2];
16         else if(j==n)//那个人是最后一个人 
17         {
18             dp[i][j]=dp[i-1][1]+dp[i-1][n-1];
19         }
20         else//普通情况,转移方程即是传到左边人的可能加上传到右边人的可能 
21         dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];
22         }
23     }
24      cout<<dp[m][1]<<endl;
25     return 0;
26 }

 

posted @ 2022-03-29 21:40  江上舟摇  阅读(32)  评论(0编辑  收藏  举报