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

这道题初一看好像真的想不出该怎么做,但是在同机房大佬的提醒下 应该用DP!

然后就想状态转移方程。。这就炸了。实在想不出该咋玩。于是我试着去画图。(别嫌弃摸鱼酱的图丑)

就以n=6时为例。

初始状态:

我们用dp[m][n]表示第m次传递后第n个小朋友的传娃娃方法数,很明显,我们需要求的即是dp[m][1]的值。找到边界值:dp[0][1]=1;然后可以发现,一个状态转移方程是无法解决这个比较复杂的dp的,需要添加if语句达到效果。

于是我开始讨论有哪些可能。因为这道题是直接用的dp,并没有构建环,所以这是需要特殊考虑的。然后,我们发现,第i次传递后的点k的方案数,只能由第i-1次传递后的点k的左右两人的方案数之和来得到!原理如下图!



但是如上所述,当这个点是1或n时需要特判,所以情况分为三种:

①这个点是1时:dp[i][j]=dp[i-1][j+1]+dp[i-1][n];

②这个点是n时:dp[i][j]=dp[i-1][j-1]+dp[i-1][1];

③这个点是普通点(非1非n时):dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];

然后双重循环,外层1…->m,内层1…->n,完事输出dp[m][1]即可。

AC代码如下:

#include<bits/stdc++.h>
using namespace std;
int dp[31][31];
int main()
{
int n,m;
cin>>n>>m;
dp[0][1]=1;
for (int i=1;i<=m;i++)
{
for (int j=1;j<=n;j++)
{
if (j==n)
{
dp[i][j]=dp[i-1][j-1]+dp[i-1][1];
}
else if(j==1)
{
dp[i][j]=dp[i-1][j+1]+dp[i-1][n];
}
else
{
dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];
}
}
}
cout<<dp[m][1]<<endl;
return 0;
}

ov.

【动态规划DP】传娃娃-C++的更多相关文章

  1. 动态规划dp

    一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...

  2. 算法-动态规划DP小记

    算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...

  3. 【转】动态规划DP

    [数据结构与算法] DP 动态规划 介绍 原创 2017年02月13日 00:42:51 最近在看算法导论. DP全称是dynamic programming,这里programming不是编程,是一 ...

  4. 动态规划DP的优化

    写一写要讲什么免得忘记了.DP的优化. 大概围绕着"是什么","有什么用","怎么用"三个方面讲. 主要是<算法竞赛入门经典>里 ...

  5. hdu 1421:搬寝室(动态规划 DP + 排序)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  6. hdu 2059:龟兔赛跑(动态规划 DP)

    龟兔赛跑 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  7. 动态规划dp专题练习

    貌似开坑还挺好玩的...开一个来玩玩=v=... 正好自己dp不是很熟悉,就开个坑来练练吧...先练个50题?小目标... 好像有点多啊QAQ 既然是开坑,之前写的都不要了! 50/50 1.洛谷P3 ...

  8. Luogu 2627 修建草坪 (动态规划Dp + 单调队列优化)

    题意: 已知一个序列 { a [ i ] } ,求取出从中若干不大于 KK 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ...

  9. 动态规划DP入门

    百度百科↓ 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman ...

随机推荐

  1. 零元学Expression Blend 4 - Chapter 6 如何置入Photoshop档案以及入门动画设计

    原文:零元学Expression Blend 4 - Chapter 6 如何置入Photoshop档案以及入门动画设计 本章将教大家如何把Photoshop档案置入Expression Blend ...

  2. MVC4使用SignalR出现$.connection is undefined错误备忘

    SignalR使用过程中一定要注意js的引用顺序,否则就会出现$.connection is undefined脚本错误.

  3. c# 计算字符串和文件的MD5值的方法

    快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中.   <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...

  4. qobject_cast<QPushButton*>(sender()) 简化信号与槽的编写(sender()取得发信号的对象后,就取得了它的全部信息,为所欲为)

    当你觉得写代码是一件重复性极高的工作时,这时你就应该考虑换个方式来实现了. 提高代码效率,减少代码量. 代码片: void Widget::onClicked() { QPushButton* but ...

  5. 最近公共祖先(least common ancestors algorithm)

    lca问题是最近公共祖先问题,一般是针对树结构的.现在有两种方法来解决这样的问题 1. On-line algorithm 用比较长的时间做预处理.然后对每次询问进行回答. 思路:对于一棵树中的两个节 ...

  6. EF 6.0 Code First 迁移MySql数据库

    一.准备工作     使用NUGET安装Entity Framework 6,下载MySql Connector/Net 6.9.5   二.创建实体     我们在下面创建了两个类(博客和文章),并 ...

  7. sql 日志恢复

    可能有不少朋友遇到过这样的问题: update或delete语句忘带了where子句,或where子句精度不够,执行之后造成了严重的后果,这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的S ...

  8. javaweb各种框架组合案例(一):maven+spring+springMVC+jdbcTemplate

    为了体现spring jdbc对于单表操作的优势,我专门对dao层做了一个抽离,使得抽离出的核心dao具有通用性.主要技术难点是对于泛型的反射.注意:单表操作中,数据库表的字段要和实体类的属性名保持高 ...

  9. SYN591-C型 时间间隔表

       SYN591-C型 时间间隔表 脉冲计数器数显计数器电机转速表使用说明视频链接: http://www.syn029.com/h-pd-250-0_310_44_-1.html 请将此链接复制到 ...

  10. DOM模型-属性操作

    HTML 元素包括标签名和若干个键值对,这个键值对就称为"属性"(attribute)."属性"本身是一个对象(Attr对象),但是实际上,这个对象极少使用.一 ...