动态规划问题
2015-06-18 13:12
183 查看
参考http://chuansong.me/n/112761
先从一个基本的例子上手
我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
令n=f(v),表示n个硬币可凑齐v元,现在需要求n的最小值
当v为0时,f(0)=0
当v为1时,可以取1元硬币了,我取1个1元硬币,f(1)=1+f(1-1)
当v为2时,可以取1元硬币,我取1个1元硬币,f(2)=1+f(2-1)=2
当v为3时,可以取1元硬币和3元硬币,我可以取1个1元或者1个3元,f(3)=min(1+f(3-1),1+f(3-3))=1
当v为4时,可以取1元硬币和3元硬币,我可以取一个1元或者1个3元,f(4)=min(1+f(4-1),1+f(4-3))=2
当v为5时,可以取1元硬币、3元硬币和5元硬币,f(5)=min(1+f(5-5),1+f(5-3),1+f(5-1)))=1
够了,通项f(v)=min(f(v-x[j])+1) x[j]表示各种面值
小结一下,动态规划就是在寻找状态方程f(v)=min(f(v-x[j])+1)
再上一个例子
找出序列的最长非递减子序列的长度,eg,序列为5,3,4,8,6,7
令n=f(v),表示前v个数的最长非递减子序列为n
当v=1时,f(1)=1
当v=2时,第2个数比第1个小,f(2)=1
当v=3时,第3个数比第2个大,f(3)=f(2)+1
当v=4时,第4个数比第1、2、3个数大,f(4)=max(f(1)+1,f(2)+1,f(3)+1)
够了,状态方程f(v)=max(1,f(j)+1) j<v&&a[v]>=a[j]
先从一个基本的例子上手
我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
令n=f(v),表示n个硬币可凑齐v元,现在需要求n的最小值
当v为0时,f(0)=0
当v为1时,可以取1元硬币了,我取1个1元硬币,f(1)=1+f(1-1)
当v为2时,可以取1元硬币,我取1个1元硬币,f(2)=1+f(2-1)=2
当v为3时,可以取1元硬币和3元硬币,我可以取1个1元或者1个3元,f(3)=min(1+f(3-1),1+f(3-3))=1
当v为4时,可以取1元硬币和3元硬币,我可以取一个1元或者1个3元,f(4)=min(1+f(4-1),1+f(4-3))=2
当v为5时,可以取1元硬币、3元硬币和5元硬币,f(5)=min(1+f(5-5),1+f(5-3),1+f(5-1)))=1
够了,通项f(v)=min(f(v-x[j])+1) x[j]表示各种面值
int getMin(int v,vector<int>& x){ //x[0]=1,x[1]=3,x[2]=5 int temp[100]={0}; //其实只用保证temp[0]=0就可以了 int flag; for(int i=1;i<=v;++i){ flag=1000; for(int j=0;j<x.size();++j){ //min(f(i-x[j])+1),自底向上的方式,不用单独去做备忘录 if(x[j]<=i&&flag>temp[i-x[j]]+1){ flag=temp[i-x[j]]+1; } } temp[i]=flag; } return temp[v]; }
小结一下,动态规划就是在寻找状态方程f(v)=min(f(v-x[j])+1)
再上一个例子
找出序列的最长非递减子序列的长度,eg,序列为5,3,4,8,6,7
令n=f(v),表示前v个数的最长非递减子序列为n
当v=1时,f(1)=1
当v=2时,第2个数比第1个小,f(2)=1
当v=3时,第3个数比第2个大,f(3)=f(2)+1
当v=4时,第4个数比第1、2、3个数大,f(4)=max(f(1)+1,f(2)+1,f(3)+1)
够了,状态方程f(v)=max(1,f(j)+1) j<v&&a[v]>=a[j]
int getMax(vector<int>& a){ if(a.empty())return 0; int b[1000]={1}; int flag=1; for(int i=0;i<a.size();++i){ for(int j=i-1;j>=0;--j){ if(a[i]>=a[j]&&b[i]<b[j]+1){ b[i]=b[j]+1; } if(b[i]<b[j]) b[i]=b[j]; } } return b[a.size()-1]; }
相关文章推荐
- WEB IM
- 《大道至简----软件工程实践者的思想》阅读笔记二
- shopnc b2b2c如何开启伪静态??
- Prim算法求最小生成树
- 关于const char*和char*、const char** 和char** 赋值问题
- HDU - 3339 In Action (最短路Dijkstra+01背包)
- linux shell 自定义函数(定义、返回值、变量作用域)介绍
- 建造者模式
- 12563 - Jin Ge Jin Qu hao
- 在WIN7下安装运行mongodb
- GRE写作论证论据素材大全—社会发展的三大理论
- 数据库索引的实现原理
- [Swust OJ 404]--最小代价树(动态规划)
- 排序--递归排序(快速排序)
- @Resource和@Autowired对比
- Android关于PagerAdapter的使用方法的总结
- 美国航天综合评价
- hadoop-2.6.0与sqoop-1.99.6的安裝配置
- android代码混淆之webView中JS无法调用
- php cli 等待用户输入方法