1143. 最长公共子序列
最重要的点,也是想不通的点在于如何处理不连续的问题,也就是dp[ i ] [ j ]的状态不知源于dp[ i-1 ] [ j-1 ]同时也源于dp[ i-1 ] [ j ]和dp[ i ] [ j-1 ]这是关键,代码如下:
public int longestCommonSubsequence(String text1, String text2) {
int re=0;
int[][] dp = new int[text1.length()+1][text2.length()+1];
for(int i=1;i<=text1.length();i++){
for(int j=1;j<=text2.length();j++){
if(text1.charAt(i-1)==text2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
if(re<dp[i][j])re = dp[i][j];
}
}
return re;
}1035. 不相交的线
和上一题一模一样,嗯直接上代码:
public int maxUncrossedLines(int[] nums1, int[] nums2) {
int re=0;
int[][] dp = new int[nums1.length+1][nums2.length+1];
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;
}else{
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
if(re<dp[i][j])re = dp[i][j];
}
}
return re;
}53. 最大子数组和
用贪心做过一遍,这次用动态规划,其实原理是一样的,判断是否大于0,如果小于0那么直接用当前的值,如果大于零就加上后边的值,最后取一个最大的即可代码如下:
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
int res = nums[0];
dp[0] = nums[0];
for(int i=1;i<nums.length;i++){
if(dp[i-1]<0)dp[i] = nums[i];
else{
dp[i] = dp[i-1] + nums[i];
}
res = dp[i]>res?dp[i]:res;
}
return res;
}版权声明:本文为qq_44051051原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。