class Solution {
public:
int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums2.size() + 1, vector<int>(nums1.size() + 1, 0));
for (int i = 1; i <= nums1.size(); i++){
for (int j = 1; j <= nums2.size(); j++){
if (nums1[i - 1] == nums2[j - 1]){
dp[j][i] = dp[j - 1][i - 1] + 1;
}else{
dp[j][i] = max(dp[j - 1][i], dp[j][i - 1]);
}
}
}
return dp[nums2.size()][nums1.size()];
}
};
线不共用起点与终点,不能相交,那么实际上就与求两个序列中顺序不变的最长子序列是一样的,所以还是用求取最长子序列的方式计算。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> dp(nums.size(), 0);
dp[0] = nums[0];
int mx = dp[0];
for (int i = 1; i < nums.size(); i++){
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
if (dp[i] > mx) mx = dp[i];
}
return mx;
}
};
这题在贪心算法的部分写过,在动态规划的写法其实大差不差,都是利用的同一个规律。如果有一个连续的序列和最大,那么序列中以边缘为起点或终点的任意子序列和就不可能为负,否则去掉这部分子序列的序列和会更大。
class Solution {
public:
bool isSubsequence(string s, string t) {
if (s.size() > t.size()) return false;
if (s.size() == 0) return true;
vector<vector<int>> dp(t.size() + 1, vector<int>(s.size() + 1, 0));
for (int i = 1; i <= s.size(); i++){
for (int j = 1; j <= t.size(); j++){
if (s[i - 1] == t[j - 1]){
dp[j][i] = dp[j - 1][i - 1] + 1;
}else{
dp[j][i] = max(dp[j - 1][i], dp[j][i - 1]);
}
}
}
if (dp[t.size()][s.size()] == s.size() && dp[t.size()][s.size()] != 0) return true;
return false;
}
};
这题与不相交的线相同,只是要在最终得到最长子序列长度后需要做一些判断来得出s是否是t的子序列