最长公共子序列
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int n1=text1.size();int n2=text2.size();int res=0;vector<int> dp(n2,0);for(int i=0;i<n1;i++){for(int j=n2-1;j>=0;j--){if(text2[j]==text1[i]){for(int k=0;k<j;k++){dp[j]=max(dp[j],1+dp[k]);}if(j==0)dp[0]=1;}if(res<dp[j])res=dp[j];}}return res;}
};
时间复杂度比较高,可以用二维dp数组
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int n1=text1.size();int n2=text2.size();int res=0;vector<vector<int>> dp(n1+1,vector<int>(n2+1,0));for(int i=1;i<n1+1;i++){for(int j=1;j<n2+1;j++){if(text1[i-1]==text2[j-1]){dp[i][j]=max(dp[i-1][j-1]+1,dp[i-1][j]);}else{dp[i][j]=max(dp[i][j-1],dp[i-1][j]);}}} return dp[n1][n2];}
};
不相交的线
- 和上面一模一样
最大子序列和
class Solution {
public:int maxSubArray(vector<int>& nums) {// int res=-__INT32_MAX__;// int max=res;// for(int num:nums){// if(res<0)res=num;// else{// res+=num;// }// if(res>max)max=res;// }// return max;int dp=nums[0];int res=dp;for(int i=1;i<nums.size();i++){if(dp>0){dp+=nums[i];}else{dp=nums[i];}if(res<dp)res=dp;}return res;}
};
贪心的代码和动态规划写出来是一样的,但思考方式不同
判断子序列
class Solution {
public:bool isSubsequence(string s, string t) {int n1=s.size();int n2=t.size();int len=0;vector<vector<int>> dp(n1+1,vector<int>(n2+1,0));for(int i=1;i<n1+1;i++){for(int j=1;j<n2+1;j++){if(s[i-1]==t[j-1]){dp[i][j]=1+dp[i-1][j-1];}else{dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}if(len<dp[i][j])len=dp[i][j];}}if(len==n1)return 1; return 0;}
};