动态规划算法

时间:2021-12-15 18:40:41

一,动态规划算法的思想

将待求解的问题分成若干个子问题,先求解子问题,然后从子问题中得到原问题的最优解。与分治算法不同的是,适合用于动态规划算法求解的问题,经分解得到的子问题往往不是互相独立的。如果使用分治算法求解,有些子问题被重复计算了很多次。为了避免这个问题,可以使用一张表记录所有已解决的子问题的答案,在需要时直接从表中找到已求解的答案,这就是动态规划算法的基本思想。


二,动态规划算法的基本要素

适用于动态规划算法求解的问题,具有两个重要的性质

1,最优子结构

当问题的最优解包含于其子问题的最优解时,称该问题具有最优子结构性质。在动态规划算法中,利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解,逐步构造出整个问题的最优解。


2,子问题重叠

在使用递归算法自顶向下求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算过多次。动态规划正是利用了这种子问题的重叠性质,对每一个子问题只求解一次,而后将求得的解放在表中,当再次需要解决此子问题时,只是简单的从表中查看一下结果。


三,常见的使用动态规划求解的问题

1,最大子段和

int maxSum(vector<int> &nums){
if(nums.size() == 0){
return -1;
}
//当前最大子段和
int sum = nums[0];
//最大子段和
int bestSum = (nums[0] > 0) ? nums[0] : -1;
for(int i = 1; i < nums.size(); i ++){
if(sum > 0){
sum += nums[i];
} else {
sum = nums[i];
}
if(sum > bestSum){
bestSum = sum;
}
}
return bestSum;
}