阶梯问题 动态规划浅析
2016-05-14 10:21
260 查看
有一个台阶,我们每次只能一次上一个或者一次上两个台阶,请问到第n个台阶有几种走法
动态规划:
首先我们将问题规模进行缩小,直到最后两节台阶,第一节台阶只有一种走法,第二节台阶有两种走法
每一节台阶可以看做有前一个台阶走一步到的,和前两个台阶走两步到的,所以是前面两者的和
所以:状态转移方程也就很好描述了
dp数组记录到第i阶台阶可以的方法
下面附上代码及解析
我们在考虑完之后回头发现,其实这是一段斐波那契数列,课件动态规划算法可以解决很多实际的问题
所以,动态规划可以解决这类问题:目前规模的解可以有小规模的问题的解求出(求的方法就是状态转移方程)
当然让我们在扩展一下,如果不止跨一和两步呢(感觉和凑硬币的问题很像)
下面附上代码
动态规划:
首先我们将问题规模进行缩小,直到最后两节台阶,第一节台阶只有一种走法,第二节台阶有两种走法
每一节台阶可以看做有前一个台阶走一步到的,和前两个台阶走两步到的,所以是前面两者的和
所以:状态转移方程也就很好描述了
dp数组记录到第i阶台阶可以的方法
下面附上代码及解析
#include"iostream" #include"cstdio" using namespace std; int dp[100]; int n; int main() { cin>>n; dp[1]=1; dp[2]=2; for(int i=3;i<=n;i++) { dp[i]=dp[i-1]+dp[i-2]; } cout<<dp <<endl; return 0; }
我们在考虑完之后回头发现,其实这是一段斐波那契数列,课件动态规划算法可以解决很多实际的问题
所以,动态规划可以解决这类问题:目前规模的解可以有小规模的问题的解求出(求的方法就是状态转移方程)
当然让我们在扩展一下,如果不止跨一和两步呢(感觉和凑硬币的问题很像)
下面附上代码
#include"iostream" #include"cstdio" using namespace std; int dp[100]; int n,m; int sto[100]; int main() { cin>>n>>m; for(int i=1;i<=m;i++) { cin>>sto[i]; } dp[1]=1; dp[0]=1; //c此处dp[0]=1的作用是当第一次遇到sto里面的书的时候,i-sto[j]=0此时应该算上一种方法,所以dp[0]=1是必需的 for(int i=2;i<=n;i++) { dp[i]=0; for(int j=1;j<=m;j++) { if(i-sto[j]>=0) dp[i]+=dp[i-sto[j]]; } } cout<<dp <<endl; return 0; }
相关文章推荐
- volatile、native、synchronized
- 安卓中修改Toast显示位置和内容
- Shell命令行快捷键
- 【知识积累】Oracle数据库安装配置
- 交换函数
- 自动对齐选择标签的做法
- java并发编程---线程池
- 使用Pull解析XML文件
- PopWindow下弹框被 NavigationBar部分遮挡的解决
- 简单浮层窗口
- call和apply区别
- closure
- 书法相关
- 【HEVC学习与研究】8.关于GOP与RAP的一些解释
- H3C supervlan 优化调教经过
- PIC单片机的配置字总结
- OC字符串和 C 语言基本数据类型的相互转换
- Unity3d Ray Marching
- 了解Browserify
- 将大于整数m且紧靠m的k个素数存入数组xx传回(160514)