力扣刷题记录(23)LeetCode:718、1143、1035
2023-12-31 16:38:17
718.?最长重复子数组
要想到用一个二维数组dp去表示数组nums1和nums2的公共子数组的最大长度。其中二维数组的索引 i、j 分别表示nums1中[0,i-1]数组、nums2中[0,j-1]数组。如果满足nums1[i-1]==nums2[j-1],那么dp[i][j]=dp[i-1][j-1]+1
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
//dp表示nums1的子串和nums2的子串 的公共最长子数组的长度
vector<vector<int>> dp(nums1.size()+1,vector<int>(nums2.size()+1,0));
int ans=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;
//提取最大长度
ans=max(ans,dp[i][j]);
}
}
return ans;
}
};
?1143.?最长公共子序列
?
?这题思路和上一题类似,还是用二维数组dp表示公共子序列长度。但难点就在于循坏内该怎么写,也就是递推公式。递推公式分两种情况:
1.text1[i-1]==text2[j-1]
? ? ? ? 这种情况dp[i][j]必然要加1,但问题是应该由哪个dp加1.应该由dp[i-1][j-1]加1,dp[i-1][j-1]才是dp[i][j]的前一个状态。dp[i][j]=dp[i-1][j-1]+1
2.text1[i-1]!=text2[j-1]
? ? ? ? 最长公共子序列会在两种情况间产生,一种是不包含text1[i-1]、一种是不包含text2[j-1].dp[i][j]=max(dp[i-1][j],dp[i][j-1])
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
vector<vector<int>> dp(text1.size()+1,vector<int>(text2.size()+1,0));
int ans=0;
for(int i=1;i<=text1.size();i++)
{
for(int j=1;j<=text2.size();j++)
{
//如果相等那最大长度肯定是要加1
if(text1[i-1]==text2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
//如果不相等 i、j就分别退1取最大值
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
ans=max(ans,dp[i][j]);
}
}
return ans;
}
};
1035.?不相交的线
这个问题可以直接转换为求最长公共子序列问题,代码同上一题一样。太难想到了
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 ans=0;
for(int i=1;i<=nums1.size();i++)
{
for(int j=1;j<=nums2.size();j++)
{
//如果相等那最大长度肯定是要加1
if(nums1[i-1]==nums2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
//如果不相等 i、j就分别退1取最大值
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
ans=max(ans,dp[i][j]);
}
}
return ans;
}
};
总结:
动态规划的本质就是当前结果依赖于之前的结果?
?
文章来源:https://blog.csdn.net/weixin_61759589/article/details/135315937
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!