钢条切割问题
来源:互联网 发布:mac reminders 编辑:程序博客网 时间:2024/06/10 21:35
动态规划的一般步骤:
1.刻画一个最优解的结构特征
2.递归定义最优解的值
3.计算最优解的值,通常采用自底向上的方法
4.利用计算出的信息构造一个最优解
利用动态规划方法求解类似钢条切割方案的这一类递归问题,可避免反复求解相同的子结构,下面是朴素递归算法和用动态规划设计的递归算法的相应实现。
//钢条切割问题#include "stdafx.h"#define N 11int p[N]={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[n]>=0)return r[n];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[n];delete [] r;return result;}int main(){int putin;while(1){cin>>putin;cout<<bottom_up_cut_rod(putin)<<endl;}}
0 0
- 钢条切割问题
- 钢条切割问题
- 钢条切割问题
- 钢条切割问题
- 钢条切割问题
- 钢条切割问题
- DP:钢条切割问题
- 动态规划-钢条切割问题
- 动态规划:钢条切割问题
- 【动态规划】钢条切割问题
- 动态规划--钢条切割问题
- 算法导论钢条切割问题
- 动态规划 钢条切割问题
- 动态规划 钢条切割问题
- 算法导论 钢条切割问题
- 动态规划-钢条切割问题
- 钢条切割
- 钢条切割
- JavaScript decodeURI()与decodeURIComponent()区别
- 字符编码笔记:ASCII,Unicode和UTF-8
- 舌尖上的职场(五)我只有十分钟!
- 蓝屏调试解决
- mysql事件
- 钢条切割问题
- [LeetCode] Reverse Integer
- myeclipse10安装svn插件
- Android Dalvik虚拟机<一>
- 增加修改表空间限额
- 教你如何升级app适配iOS 7
- Oracle定时器(Job)各时间段写法汇总
- const常量和readonly只读变量
- springmvc 整合hibernate3