钢条切割问题
2014-05-22 09:11
295 查看
动态规划的一般步骤:
1.刻画一个最优解的结构特征
2.递归定义最优解的值
3.计算最优解的值,通常采用自底向上的方法
4.利用计算出的信息构造一个最优解
利用动态规划方法求解类似钢条切割方案的这一类递归问题,可避免反复求解相同的子结构,下面是朴素递归算法和用动态规划设计的递归算法的相应实现。
1.刻画一个最优解的结构特征
2.递归定义最优解的值
3.计算最优解的值,通常采用自底向上的方法
4.利用计算出的信息构造一个最优解
利用动态规划方法求解类似钢条切割方案的这一类递归问题,可避免反复求解相同的子结构,下面是朴素递归算法和用动态规划设计的递归算法的相应实现。
//钢条切割问题 #include "stdafx.h" #define N 11 int p ={0,1,5,8,9,10,17,17,20,24,30}; //朴素递归 O(2^n) int cut_rod(int n) { if(n==0) return 0; int max=-1; for(int i=1;i<=n;++i) { int tmp=p[i]+cut_rod(n-i); if(max<tmp) { max=tmp; } } return max; } //动态规划,带备忘的自顶向下 //辅助过程 int memoized_cut_rod_AUX(int n,int* r); int memoized_cut_rod(int n) { int *r=new int[n+1]; for(int i=0;i<=n;++i) { r[i]=-1; } int result=memoized_cut_rod_AUX(n,r); delete [] r; return result; } int memoized_cut_rod_AUX(int n,int* r) { if(r >=0) return r ; if(0==n) return 0; int max=-1; for(int i=1;i<=n;++i) { int tmp=p[i]+memoized_cut_rod_AUX(n-i,r); if(max<tmp) { max=tmp; } } return max; } //自底向上 int bottom_up_cut_rod(int n) { int* r=new int[n+1]; for(int i=0;i<=n;++i) { r[i]=0; } for(int j=1;j<=n;++j) { int max=-1; for(int k=1;k<=j;++k) { int tmp=p[k]+r[j-k]; if(max<tmp) max=tmp; } r[j]=max; } int result=r ; delete [] r; return result; } int main() { int putin; while(1) { cin>>putin; cout<<bottom_up_cut_rod(putin)<<endl; } }
相关文章推荐
- 动态规划-钢条切割问题
- 算法实践篇-钢条切割问题-动态规划
- 钢条切割问题
- 动态规划 钢条切割问题的朴素解法
- 钢条切割问题的解法(C/C++)
- 动态规划_钢条切割问题
- 数据结构学习笔记6-动态规划(钢条切割问题)
- 算法导论第十五章之钢条切割问题(自顶向下法)
- 算法导论读书笔记之钢条切割问题
- 动态规划:钢条切割问题
- 动态规划算法 - 钢条切割问题
- 动态规划之钢条切割问题
- 动态规划之钢条切割问题
- 算法导论第十五章之钢条切割问题(自底向上版本)
- 动态规划 钢条切割问题
- 动态规划问题之钢条切割
- 用动态规划算法求解钢条切割问题
- 动态规划解决钢条切割问题
- 动态规划之钢条切割问题
- 动态规划 钢条切割问题 两种方法 自底而上 自上而下的方法