击鼓传花(dp)

击鼓传花

Time Limit:1000MS Memory Limit:65535K
题型: 填空题 语言: 无限制

描述
击鼓传花,也称传彩球,是中国传统的民间游戏。现在编号为1至n的 n名同学按编号次序顺时针围坐成一圈,
小明坐在1号位置,他左手边是2号,右手边是n号。彩花开始在小明手里,鼓声响起之后,小明可以把花传递
给2号同学,也可以传递给n号同学,接到花的同学可以随意选择向左还是向右传递。鼓声停止时,花在谁的手
里谁就要表演节目。
请问有多少种传递方法使得从小明手里开始传递的花,传了m次后,又回到小明手里。两种传递方法被认为不
同,当且仅当这两种方法中,接到球的同学按照顺序组成的序列是不同的。比如3个同学1号、2号、3号,小明
为1号,球传了2次回到小明手里方法有 1->2->1和1->3->1两种,球传了3次回到小明手里的方式有1->2->3->1
和1->3->2->1两种。

输入格式
仅一行,正整数n和m。(3<=n,m<=10)。
输出格式
一个整数,表示传递m次后花又回到小明手里的传递方法数。
输入样例
6 5
输出样例
0
提示
【输入样例2】
4 4
【输出样例2】
8
样例2说明:4个人传4次,共有8种方法1->2->1->2->1,1->2->3->2->1,1->2->3->4->1,1->2->1->4->1,
1->4->1->4->1,1->4->3->4->1,1->4->3->2->1,1->4->1->2->1。

思路:(动态规划)假设我是1号,我想知道传递m次到我手中有多少种情况,首先我就要知道在花传到我手上之前能有多少种情况,那我要知道花传到与我相邻的那两个人能有多少种情况,即传递m-1次能够到相邻两人的总情况:dp[m][1]=dp[m-1][n]+dp[m-1][2];(其中横向是要求传递的次数,纵向是当前人的编号),沿着这个思路自下向上推导出dp[m][1]

#include<stdio.h>
#include<string.h>
int main()
{
    int j,k,i,y,x,m,n;
    int dp[31][31];
    scanf("%d %d",&n,&m);//n是人数,m是要求的传递次数
    memset(dp,0,sizeof(dp));
    //通过i=1,j=1时判断出所需要的初始条件
    dp[0][1]=1;



    for(i=1;i<=m;i++)//i负责要求的传递次数
    {
        for(j=1;j<=n;j++)//j负责人员编号
        {
            if(j==n)
            {
                dp[i][j]=dp[i-1][1]+dp[i-1][n-1];
            }
            else if(j==1)
            {
                dp[i][j]=dp[i-1][2]+dp[i-1][n];
            }
            else
            {
                dp[i][j]=dp[i-1][j+1]+dp[i-1][j-1];
            }
        }
    }
    printf("%d",dp[m][1]);




return 0;
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值