300.最長遞增子序列
dp數組的含義為dp[i]表示字符串以第i位置為末尾的最長遞增子序列的長度。
for (int i = 1; i < nums.size(); i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);}if (dp[i] > result) result = dp[i]; // 取長的子序列
}
dp[i]的推導需要用到i之前的dp數組的值,當nums[i] > nums[j]時,也就是說i可以在以j為末尾的最長子序列上再延長1.
674. 最長連續遞增序列
這題相對于上題題目添加了限制條件,連續要求dp[i]只能通過dp[i-1]推導出來
if(nums[i]>nums[i-1])dp[i] = dp[i-1] + 1;
同時,因為只需要考慮相鄰的兩項,所以只需要i的一重循環。
718. 最長重復子數組
dp[i][j]表示以i-1為結尾的A,和以j-1為結尾的B,最長重復子數組的長度為dp[i][j]
if (nums1[i - 1] == nums2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;}
?這樣做的好處是方便初始化,可以將dp[0][j],dp[i][0]直接初始化為0