击鼓传花
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;
}