动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的。分治算法是指将问题划分为一些独立的子问题,递归的求解各个问题,然后合并子问题的解而得到原问题的解。例如归并排序,快速排序都是采用分治算法思想。动态规划中各个子问题包含公共子问题,如在这种情况下,用分治算法则会重复做不必要的工作。采用动态规划算法对每个子问题只求解一次,将其结果存放到一张表中,以供后面的子问题参考,从而避免每次遇到各个子问题时重新计算答案。
动态规划与分治法之间的区别:
(1)分治法是指将问题分成一些独立的子问题,递归的求解各子问题
(2)动态规划适用于这些子问题不是独立的情况,也就是各子问题包含公共子问题
书中15.1节钢条切割问题,代码如下:
#include <iostream>
using namespace std;
int cut_rod(int p[],int n)
{
if(n==0) return 0;
int q=-100;
for(int i=1;i<=n;i++)
{
q=max(q,p[i-1]+cut_rod(p,n-i));
}
return q;
}
int *bottom_up_cut_rod(int p[],int n)
{
int r[n],s[n],result[2];
r[0]=0;
for(int j=1;j<=n;j++)
{
int q=-100;
for(int i=1;i<=j;i++)
{
// cout<<n<<' '<<q<<' '<<p[i-1]+r[j-i]<<endl;
if(q<p[i-1]+r[j-i])
{
q=p[i-1]+r[j-i];
s[j]=i;
}
}
r[j]=q;
}
//cout<<s[n]<<' ';
result[0]=r[n];
result[1]=s[n];
return result;
}
int main()
{
cout << "Hello world!" << endl;
int p[10]={1,5,8,9,10,17,17,20,24,30};
int *result;
int i;
/*for(i=0;i<10;i++)
cout<<cut_rod(p,i+1)<<endl;*/
for(i=0;i<10;i++)
{
result=bottom_up_cut_rod(p,i+1);
cout<<result[0]<<' '<<result[1]<<endl;
}
return 0;
}