传娃娃

Description
学习空闲之余,小信经常带着同学们做游戏,最近小信发明了一个好玩的新游戏:n 位同学围成一个圈,同学 A 手里拿着一个布娃娃。小信喊游戏开始,每位手里拿着娃娃的同学可以选择将娃娃传给左边或者右边的同学,当小信喊游戏结束时,停止传娃娃。此时手里拿着娃娃的同学即是败者。
玩了几轮之后,小信想到一个问题:有多少种不同的方法,使得从同学 A 开始传娃娃,传了 m 次之后又回到了同学 A 手里。两种方法,如果接娃娃的同学不同,或者接娃娃的顺序不同均视为不同的方法。例如 1->2->3->1和 1->3->2->1 是两种不同的方法。

Input
输入一行,输入两个整数 n,m(3≤n≤30,1≤m≤30),表示一共有 n 位同学一起游戏,一共传 m 次娃娃。
Output
输出一行,输出一个整数,表示一共有多少种不同的传娃娃方法。

Sample Input 1
3 3
Sample Output 1
2

兔子为什么要写这种水题的题解
兔子认为,这道题,算是道普及组难度的题目(其实我们并不会估计题目难度的啦 ),但是我们也就不能说这是就是一道水题
题目可能是有点水,但是也有点感觉真正的dp感觉了 。
废话不多说,题解现在正式开始!
YCOJ传娃娃(C++)

思路(ZK常曰:“先构思,再打代码!” )[不要再说了,知道了知道了]
如果我们现在直接上代码,肯定对新人很不友好(蒟蒻附体 )。现在做还是有一点困难,所以我们开始谈谈人生 (呸,是思路)

首先是拆分过程, 定义子状态
从 A 开始传, 第 m 次传到 A , 那么只能从 A 的左边和右边传过去
现在定义状态 dp[m, 0] 为传了 m 次传到 A 的方法数
状态转移方程为 dp[m, 0] = dp[m - 1, 1] + dp[m - 1, (0 - 1) % n]
dp[m - 1, 1] 表示 传了 m - 1 次, 传到 1 的方法数
dp[m - 1, (0 - 1) % n] 表示 传了 m - 1 次, 传到 (0 - 1) % n的方法
取余的目的是将这些人围成一个环

我知道你是一脸懵逼的,所以··· ···
YCOJ传娃娃(C++)
贴心的兔子为你准备了图片(最喜欢画图了呢~23333)

等一下,兔子说一句重要的话:传球到自己手中只有两种可能性,就是从第i+1人手中或i-1手中传到自己手中,得到状态转移方程:f[i][j] = f[i-1][j-1]+f[i+1][j-1]。

记住这句话,对下面的编写程序有用~

YCOJ传娃娃(C++)
摘自大佬Time Limit Exceed,这是我们同学的图,懒得再花时间画图了

解得:递推是个好东西~

代码(接下来,就是最激动人心的代码公开环节了)
兔子手把手教你写代码
粗犷兔子直接上源码

图片~~

AC的正推法
YCOJ传娃娃(C++)

TLE的倒退法
YCOJ传娃娃(C++)

知道你想粘贴代码,就是不给你机会,2333333333。

本期题解就到这里,希望小伙伴们点个关注,下期我们再会,233333333~拜啦!!YCOJ传娃娃(C++)

相关文章: