@@ -1771,6 +1771,7 @@ public int minPathSum(int[][] grid) {
1771
1771
1772
1772
<div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=dp[i-1]+dp[i-2] " /></div >
1773
1773
1774
+
1774
1775
dp[ N] 即为所求。
1775
1776
1776
1777
考虑到 dp[ i] 只与 dp[ i - 1] 和 dp[ i - 2] 有关,因此可以只用两个变量来存储 dp[ i - 1] 和 dp[ i - 2] 即可,使得原来的 O(n) 空间复杂度优化为 O(1) 复杂度。
@@ -1800,6 +1801,7 @@ public int climbStairs(int n) {
1800
1801
1801
1802
<div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=dp[i-1]+dp[i-3] " /></div >
1802
1803
1804
+
1803
1805
** 强盗抢劫**
1804
1806
1805
1807
[ Leetcode : 198. House Robber (Easy)] ( https://leetcode.com/problems/house-robber/description/ )
@@ -1810,6 +1812,7 @@ public int climbStairs(int n) {
1810
1812
1811
1813
<div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=max(dp[i-2],dp[i-3])+nums[i] " /></div >
1812
1814
1815
+
1813
1816
O(n) 空间复杂度实现方法:
1814
1817
1815
1818
``` java
@@ -1890,6 +1893,7 @@ private int rob(int[] nums, int s, int e) {
1890
1893
1891
1894
<div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=(i-1)*dp[i-2]+(i-1)*dp[i-1] " /></div >
1892
1895
1896
+
1893
1897
dp[ N] 即为所求。
1894
1898
1895
1899
和上楼梯问题一样,dp[ i] 只与 dp[ i-1] 和 dp[ i-2] 有关,因此也可以只用两个变量来存储 dp[ i-1] 和 dp[ i-2] 。
@@ -1906,6 +1910,7 @@ dp[N] 即为所求。
1906
1910
1907
1911
<div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[n]=max\{1,dp[i]+1|S_i<S_n\&\&i<n\} " /></div >
1908
1912
1913
+
1909
1914
对于一个长度为 N 的序列,最长子序列并不一定会以 S<sub >N</sub > 为结尾,因此 dp[ N] 不是序列的最长递增子序列的长度,需要遍历 dp 数组找出最大值才是所要的结果,即 max{ dp[ i] | 1 <= i <= N} 即为所求。
1910
1915
1911
1916
** 最长递增子序列**
@@ -2047,6 +2052,7 @@ public int lengthOfLCS(int[] nums1, int[] nums2) {
2047
2052
2048
2053
<div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v) " /></div >
2049
2054
2055
+
2050
2056
``` java
2051
2057
public int knapsack(int W , int N , int [] weights, int [] values) {
2052
2058
int [][] dp = new int [N ][W ];
@@ -2071,6 +2077,7 @@ public int knapsack(int W, int N, int[] weights, int[] values) {
2071
2077
2072
2078
<div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[j]=max(dp[j],dp[j-w]+v) " /></div >
2073
2079
2080
+
2074
2081
因为 dp[ j-w] 表示 dp[ i-1] [ j-w ] ,因此不能先求 dp[ i] [ j-w ] 防止将 dp[ i-1] [ j-w ] 覆盖。也就是说要先计算 dp[ i] [ j ] 再计算 dp[ i] [ j-w ] ,在程序实现时需要按倒序来循环求解。
2075
2082
2076
2083
** 无法使用贪心算法的解释**
0 commit comments