摘要:
最长公共子序列(LeetCode 1143题 难度:中等) 第一步:dp数组定义(字符串一般是二维) dp[i][j]:表示S1[0,i]和S2[0,J]中最长的公共子序列的长度 S1="ace" S2="babcde" 比如dp[2][4]=2的含义,就是 S1="ac"和S2=“babc”,他们 阅读全文
摘要:
最大子序和(LeetCode 53题 难度:简单) dp数组定义 dp[i]就是以nums[i]结尾的"最大子数组的和" dp[i]有两种选择: 要么与前面相邻的子数组连接,形成一个更大的子序和的数组 要么不与前面连接,自成一派,自己作为一个子数组 要么 自成一派,要么与前面的子数组合 并形成更大的 阅读全文
摘要:
信封嵌套问题(LeetCode 354题 难度:困难) 思路:转二维 为 一维 调用 上篇文章 解答 先对宽度w进行升序排列,如果遇到w相同的情况,则按照高度H进行降序排列(因为宽度一样不可能套娃,比如5 和5 不能同时进 去), 然后把所有的H 作为一个数组,在这个数组上进行 计算(LIS) 官方 阅读全文
摘要:
dp数组的遍历方向 我相信读者做动态规划问题时,肯定会对dp数组的遍历顺序有些头疼。我们拿二维dp数组来举例,有时候我们是正向遍历: //正向遍历 int[][] dp = new int[m][n]; for (int i = 0; i < m; i++) for (int j = 0; j < 阅读全文
摘要:
动态规划详解 动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。 既然是要求最值,核心问题是什么呢?求解动态规划的核心问题是穷举。因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值呗。 阅读全文