动态规划的基本思想其实就是分治,但是与分治算法还是有区别的,动态规划划分的规模小的问题不是相互独立的。整个问题的最优解是建立在子问题的基础上的。
用动态规划方法求解问题一般分为以下四个步骤:
1、观察解的结构,刻画其结构特征。
2、递归的定义最优解。
3、自底向上求最优解。
4、根据计算最优值的信息求构造最优解。
满足动态规划算法的问题有两个特征:
1、最优子结构性质。问题的最优解包含子问题的最优解,则称该问题具有最优子结构性质。
2、重叠子问题性质。
举例:
最典型的可以用动态规划算法的问题就是最大子段和问题,一个整数数组,有正也有负,求连续的和最大的子数组。
分析:
问题的解是:
1、观察解结构,刻画其结构特征。
令,所以问题就变成了求b[j](0<=j<=n-1)的最大值。
2、递归定义最优解。
可以发现,如果b[j] > 0,那么b[j+1] = b[j] + a[j+1];否则b[j+1] = a[j+1];可以发现该问题满足用动态规划方法的两个条件。
3、自底向上求最优值。
int max_sub_array(const int a[], int ilen)
{
if (ilen <= 0)
{
return;
}
int isum = a[0];
int imax = isum;
for (int i = 1; i < ilen; i++)
{
if (isum > 0)
{
isum += a[i];
}
else
{
isum = a[i];
}
if (isum > imax)
{
imax = isum;
}
}
return imax;
}
4、求解最优值。
可以把问题扩展到二维数组。如何求得a[i][j]的最大子二维数组的和。