这个题首先初始化的时候一定是 .size()+1 因为到了.size()的时候 还要再加一位 这样才对
另外你这个思路一定要对 它是重叠不是加 也就是初始化的初值应该是0
其实本质上感觉你还是对于动态规划的数组的定义理解的不到位
vector<vector<int>> dp (text1.size()+1,(text2.size()+1,0));
这里定义的时候还是有些问题的
你应该定义成vector<vector<int>> dp (text1.size()+1,vector <int>(text2.size()+1,0));
还有就是你在遍历的时候也是要遍历到tex1.size()+1 而不是到结尾就完了 你还要再去多遍历一位!!!!!
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
vector<vector<int>> dp (text1.size()+1,vector<int>(text2.size()+1,0));
int result =0;
if(text1.size()==1&&text2.size()==1 && text1==text2)
return 1;
for(int i=1;i<=text1.size();i++){
for(int j=1;j<=text2.size();j++){
if(text1[i-1]==text2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],max(dp[i][j-1],dp[i-1][j-1]));
if(dp[i][j]>result)
result=dp[i][j];
}
}
return result;
}
};
class Solution {
public:
int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums1.size()+1,vector<int>(nums2.size()+1,0));
int result=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[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[nums1.size()][nums2.size()];
}
};
这个第二题几乎一模一样 但是你还是要注意 比较的时候是比较nums1[i-1]和nums2[j-1] 因为不这样的话会越界!!! 因为你毕竟是假设元素多一个 你可以想想两个字符串如果是完全相同的情况下 要+1
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result=nums[0];
if(nums.size()==1)
return nums[0];
vector<int>dp(nums.size(),0);
dp[0]=nums[0];
for(int i=1;i<nums.size();i++){
dp[i]=max(nums[i],dp[i-1]+nums[i]);
if(dp[i]>result)
result=dp[i];
}
return result;
}
};
这个题明显用动态规划后就好很多了 就是再去注意两个点
1 result需要初始化为dp[0] 不然的话 第二个元素第一次比较的时候就会错 因为你这个循环是不比较第一个元素的
2 dp[0]要初始化为nums[0] 因为你的dp是依赖于dp[i-1]的 其实你犯的是同样的错误 也就是你不知道这个循环其实是跳过第一轮的 因此有错误