3.1概述
核心思想:
动态规划是计算机中解决最优化问题的一种方法
通过避免重复节点的计算来提高计算速度
使用字典或者哈希表保存计算中间结果,因此也称之为【记忆化搜索】
这也是动态算法是一种用空间换时间的策略
经典案例:
给定一个无序数组,找出其中最长的、递增的子序列的长度
思路:
暴力搜索:
定义一个函数 L(arrs,i), 返回从数组第i个长度开始的最长序列的长度
具体如下:
public int L(int[] arrs, int i) {
for(int j=i+1;j<arrs.length;j++) {
if(arrs[j]>arrs[i]) {
return L(j) + 1;
}
}
}
遍历数组,找最长的递增子序列长度
public int R(int[] arrs) {
int max_length = 1;
for(int i = 0; i<arr.length; i++) {
max_length = max(max_length, L(arrs, i))
}
return
}
给定一个无序数组,找出其中连续子序列的最大和
动态规划算法的一般思路:
穷举法/暴力搜索
如果发现大量重复计算
就用哈希表将中间计算结果保存下来
之后遍历到相同节点,直接从哈希表取值