传球游戏

传球游戏

https://ac.nowcoder.com/acm/problem/16619

题意:

n个同学围成一个圆圈进行传球游戏,一个同学传球时只能传给左右的同学,传m次最终回到第一个人手里,问你有多少种情况?

思路:

第一步:确定状态——原问题是什么,子问题是什么?

  • 原问题:从1开始传球,第m步回到1号的情况数
  • 子问题:从1开始传球第i步到达j号的情况数
  • dp[i] [j]表示第i次传球后在j位置的情况数

第二步:确定状态转移方程和边界

  • dp[i] [j] = dp[i - 1] [j - 1] + dp[i - 1] [j + 1]

  • dp[0] [1] = 1 ,初始条件一号开始的时候是1

  • 是个环,需要对边界1和m进行讨论

    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <stdlib.h>
    #include <sstream>
    #include <map>
    #include <set>
    using  namespace std;
    #define inf 0x3f3f3f3f
    #define MAX 1000000 + 7
    #define endl '\n'
    #define mod 1e9+7;
    typedef  long long ll ;
    //不开longlong见祖宗!
    //ios::sync_with_stdio(false);
    //cin.tie(0); cout.tie(0);
    inline int IntRead(){char ch = getchar();int s = 0, w = 1;while(ch < '0' || ch > '9'){if(ch == '-') w = -1;
            ch = getchar();}while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0';ch = getchar();}return s * w;}
    
    int n, m;
    int dp[100][100];
    
    int main(){
        cin>>n>>m;
        dp[0][1] = 1;
        for(int i = 1; i <= m; ++i)
        for(int j = 1; j <= n; ++j){
            if(j == 1){
                dp[i][j] = dp[i - 1][j + 1] + dp[i - 1][n];
            }
            else if(j == n){
                dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][1];
            }
            else dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1];
        }
        cout<<dp[m][1]<<endl;
    }
    
全部评论

相关推荐

一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
评论
12
收藏
分享
牛客网
牛客企业服务