@@ -1769,8 +1769,7 @@ public int minPathSum(int[][] grid) {
1769
1769
1770
1770
定义一个数组 dp 存储上楼梯的方法数(为了方便讨论,数组下标从 1 开始),dp[ i] 表示走到第 i 个楼梯的方法数目。第 i 个楼梯可以从第 i-1 和 i-2 个楼梯再走一步到达,走到第 i 个楼梯的方法数为走到第 i-1 和第 i-2 个楼梯的方法数之和。
1771
1771
1772
- <div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=dp[i-1]+dp[i-2] " /></div >
1773
-
1772
+ <div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=dp[i-1]+dp[i-2] " /></div > <br >
1774
1773
1775
1774
dp[ N] 即为所求。
1776
1775
@@ -1799,8 +1798,7 @@ public int climbStairs(int n) {
1799
1798
1800
1799
第 i 年成熟的牛的数量为:
1801
1800
1802
- <div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=dp[i-1]+dp[i-3] " /></div >
1803
-
1801
+ <div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=dp[i-1]+dp[i-3] " /></div > <br >
1804
1802
1805
1803
** 强盗抢劫**
1806
1804
@@ -1810,8 +1808,7 @@ public int climbStairs(int n) {
1810
1808
1811
1809
定义 dp 数组用来存储最大的抢劫量,其中 dp[ i] 表示抢到第 i 个住户时的最大抢劫量。由于不能抢劫邻近住户,因此如果抢劫了第 i 个住户那么只能抢劫 i - 2 和 i - 3 的住户,所以
1812
1810
1813
- <div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=max(dp[i-2],dp[i-3])+nums[i] " /></div >
1814
-
1811
+ <div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=max(dp[i-2],dp[i-3])+nums[i] " /></div > <br >
1815
1812
1816
1813
O(n) 空间复杂度实现方法:
1817
1814
@@ -1891,8 +1888,7 @@ private int rob(int[] nums, int s, int e) {
1891
1888
1892
1889
综上所述,错误装信数量方式数量为:
1893
1890
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 >
1895
-
1891
+ <div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[i]=(i-1)*dp[i-2]+(i-1)*dp[i-1] " /></div > <br >
1896
1892
1897
1893
dp[ N] 即为所求。
1898
1894
@@ -1908,8 +1904,7 @@ dp[N] 即为所求。
1908
1904
1909
1905
因为在求 dp[ n] 时可能无法找到一个满足条件的递增子序列,此时 {S<sub >n</sub >} 就构成了递增子序列,因此需要对前面的求解方程做修改,令 dp[ n] 最小为 1,即:
1910
1906
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 >
1912
-
1907
+ <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 > <br >
1913
1908
1914
1909
对于一个长度为 N 的序列,最长子序列并不一定会以 S<sub >N</sub > 为结尾,因此 dp[ N] 不是序列的最长递增子序列的长度,需要遍历 dp 数组找出最大值才是所要的结果,即 max{ dp[ i] | 1 <= i <= N} 即为所求。
1915
1910
@@ -2050,8 +2045,7 @@ public int lengthOfLCS(int[] nums1, int[] nums2) {
2050
2045
2051
2046
综上,0-1 背包的状态转移方程为:
2052
2047
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 >
2054
-
2048
+ <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 > <br >
2055
2049
2056
2050
``` java
2057
2051
public int knapsack(int W , int N , int [] weights, int [] values) {
@@ -2075,8 +2069,7 @@ public int knapsack(int W, int N, int[] weights, int[] values) {
2075
2069
2076
2070
在程序实现时可以对 0-1 背包做优化。观察状态转移方程可以知道,前 i 件物品的状态仅由前 i-1 件物品的状态有关,因此可以将 dp 定义为一维数组,其中 dp[ j] 既可以表示 dp[ i-1] [ j ] 也可以表示 dp[ i] [ j ] 。此时,
2077
2071
2078
- <div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[j]=max(dp[j],dp[j-w]+v) " /></div >
2079
-
2072
+ <div align =" center " ><img src =" https://latex.codecogs.com/gif.latex?dp[j]=max(dp[j],dp[j-w]+v) " /></div > <br >
2080
2073
2081
2074
因为 dp[ j-w] 表示 dp[ i-1] [ j-w ] ,因此不能先求 dp[ i] [ j-w ] 防止将 dp[ i-1] [ j-w ] 覆盖。也就是说要先计算 dp[ i] [ j ] 再计算 dp[ i] [ j-w ] ,在程序实现时需要按倒序来循环求解。
2082
2075
0 commit comments