算法学习之路|蒜头君的新游戏1

工作空闲之余,蒜头君经常带着同事们做游戏,最近蒜头君发明了一个好玩的新游戏:nn 位同事围成一个圈,同事 A 手里拿着一个兔妮妮的娃娃。蒜头君喊游戏开始,每位手里拿着娃娃的同事可以选择将娃娃传给左边或者右边的同学,当蒜头君喊游戏结束时,停止传娃娃。此时手里拿着娃娃的同事即是败者。

玩了几轮之后,蒜头君想到一a个问题:有多少种不同的方法,使得从同事 A 开始传娃娃,传了 mm 次之后又回到了同事 A 手里。两种方法,如果接娃娃的同事不同,或者接娃娃的顺序不同均视为不同的方法。例如 1−>2−>3−>11−>2−>3−>1 和 1−>3−>2−>11−>3−>2−>1 是两种不同的方法。

输入格式
输入一行,输入两个整数 n,m(3≤n≤30,1≤m≤30)n,m(3≤n≤30,1≤m≤30),表示一共有 nn 位同事一起游戏,一共传 mm 次娃娃。

输出格式
输出一行,输出一个整数,表示一共有多少种不同的传娃娃方法。

样例输入
3 3
样例输出
2

本体的难点是分出阶段,找出决策,列出状态转移方程。

我们把dpi看做所剩i步,到达同事j所有种情况数。

看例题:我们编号3位同事0~2,如果求0~0的所有情况,那么就要知道在还剩下1步的情况下,

到达1,2的所有情况,即dp0=dp1+dp1;

所以,我们得出状态转移方程dpi=dpi+1+dpi-1.//思路对的,不考虑环路

(因为是环路,所以应该改为dpi=dpi+1+dpi+1;)

最后,我们列出特殊情况:

即当所剩步数是m时,只有dp0=1

(自己到自己肯定不需要走嘛,其他dp0=0,因为0号到其他肯定要走路,不存在0~其他 无需走路的情况)

#include<iostream>
using namespace std;
int main(){
    int dp[31][30];//每行代表所剩步数,每列代表每位同事
    int n,m;
    cin>>n>>m;
    dp[m][0]=1;//所剩步数是m的有一种情况:从第0位同事开始,不动,到自己。
    for(int i=1;i<n;i++)   dp[m][i]=0;//其余剩下m步的情况肯定不存在
    for(int i=m-1;i>=0;i--){
        for(int j=0;j<n;j++){
            dp[i][j]=dp[i+1][(j+n+1)%n]+dp[i+1][(j+n-1)%n];
        }//当在0~5时,5 0 1满足,4 5 0也满足
    }
    cout<<dp[0][0];//输出当步数为0,且到达同事0时的所有方法
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值