最长递增子序列
300. 最长递增子序列 - 力扣(LeetCode)
递推公式:
有点像双指针的操作,例如{2,5,6,4,3}(写不出来,画图)
public class Solution {
public int LengthOfLIS(int[] nums) {
if (nums.Length <= 1) return nums.Length;
int[] dp = new int[nums.Length];
int result = 0;
for (int i = 0; i < nums.Length; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) dp[i] = Math.Max(dp[i], dp[j] + 1);
}
result = Math.Max(result, dp[i]);
}
return result;
}
}
最长连续递增序列
674. 最长连续递增序列 - 力扣(LeetCode)
数组不连续递增就重新计数
public class Solution {
public int FindLengthOfLCIS(int[] nums) {
if(nums.Length <= 1){return nums.Length;}
int[] dp = new int[nums.Length];
int result = 0;
for(int i=0;i<nums.Length;i++){
dp[i] = 1;
if(i>0 && nums[i]>nums[i-1]){
dp[i] = dp[i-1]+1;
}
if(dp[i]>result)result = dp[i];
}
return result;
}
}
最长重复子数组
718. 最长重复子数组 - 力扣(LeetCode)
这个图就很清楚递推怎么来的
public class Solution {
public int FindLength(int[] nums1, int[] nums2) {
int[,] dp = new int[nums1.Length + 1, nums2.Length + 1];
int result = 0;
for (int i = 1; i <= nums1.Length; i++) {
for (int j = 1; j <= nums2.Length; j++) {
if (nums1[i - 1] == nums2[j - 1]) {
dp[i, j] = dp[i - 1, j - 1] + 1;
}
if (dp[i, j] > result) result = dp[i, j];
}
}
return result;
}
}