首页 > 其他分享 >代码随想录训练营day44|1143.最长公共子序列,1035.不相交的线, 53. 最大子序和,392.判断子序列

代码随想录训练营day44|1143.最长公共子序列,1035.不相交的线, 53. 最大子序和,392.判断子序列

时间:2024-09-11 18:24:07浏览次数:3  
标签:1143 int text1 随想录 text2 vector 序列 dp

1143.最长公共子序列

这题并不要求连续
子序列的要求是可以删除某些元素,但不能改变顺序。
顺着上题的思路,这题也应该设立一个二维数组

 vector<vector<int>> dp(text1.size(),vector<int>(text2.size(),0));

dp[i][j]表示的是以text1[i]为结尾的字符串和以text2[j]为结尾的字符串的最长公共子序列。
如果text1[i]和text2[j]相等的话,则dp[i][j]=dp[i-1][j-1]+1;
(两个同时回退)
如果不相等的话
则应该考虑dp[i-1][j]和dp[i][j-1]中的最大值

if(text1[i]==text2[j])
    dp[i][j]=dp[i-1][j-1]+1;
    //如果相同同时回退
else{
    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}

初始化的时候要注意,如果text1[i]==text2[0]
则dp[i][0]=1;
如果不相等,则继承上一次的值,而不是为0.

for(int i=0;i<text1.size();i++){
    if(text1[i]==text2[0])
         dp[i][0]=1;
     else if(i>0){
         dp[i][0]=dp[i-1][0];
     }
 }
 for(int j=1;j<text2.size();j++){
     if(text2[j]==text1[0])
         dp[0][j]=1;
     else if(j>0)
         dp[0][j]=dp[0][j-1];
 }

看了一下力扣官解,也可以创造一个m+1和n+1大小的矩阵,这样就不用专门初始化。

1035.不相交的线

思路:只有两个数字相等时才连线,那其实就是找最长公共子数组。

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size();
        int n=nums2.size();
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        for(int i=1;i<m+1;i++){
            for(int j=1;j<n+1;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[m][n];
    }
};

53. 最大子序和

之前是用贪心写的,现在用动规写一遍
题目

dp[i]=max(dp[i-1]+nums[i],nums[i]);

392.判断子序列

题目
可以把它当成求最长公共子序列的长度来做,使得它==s.size();
我写了另一种定义:
dp[i][j]表示的是以s[i]为结尾的字符串是否是t[j]为结尾的字符串的子序列。

 vector<vector<bool>> dp(m,vector<bool>(n,false));

注意:1.j从i开始,因为j必须大于i的长度,才有可能s是j的子序列。2.由于这里明确给出了s是t的子序列,所有在i和j不相等时,只用删除j就可以,不能删除i

for(int i=0;i<m;i++){
   for(int j=i;j<n;j++){
        if(s[i]==t[j]){
            if(i>0&&j>0)
                dp[i][j]=dp[i-1][j-1];
            else
                dp[i][j]=true;
        }
        else{
            if(j>0)
                dp[i][j]=dp[i][j-1];
        }
            
    }
}

双指针

当然这题也可以用双指针来做

标签:1143,int,text1,随想录,text2,vector,序列,dp
From: https://blog.csdn.net/wwwgxd/article/details/142144790

相关文章

  • 代码随想录算法训练营Day1
    目录704.二分查找 27.移除元素977.有序数组的平方 704.二分查找 分类:左闭右闭、左闭右开Tips:1.循环条件:左闭右闭:左索引<=右索引左闭右开:左索引<右索引2.循环操作:处理元素>目标值:左闭右闭:右索引=折半索引-1左闭右开:右索引=折半索引classSolution{......
  • Springboot枚举自定义序列化
    packagexxxxxxxxxxxxx;importcom.fasterxml.jackson.core.JsonGenerator;importcom.fasterxml.jackson.databind.JsonSerializer;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.databind.SerializerProvider;importcom.fasterx......
  • 【高级编程】Java IO流(补)序列化 & 反序列化
    序列化(ObjectOutputStream)&反序列化(ObjectInputStream)Java的序列化和反序列化是用于将对象转换为字节流的过程,以便在网络上传输或保存到磁盘,然后将这些字节流再转换回对象。这个过程是Java中处理对象持久化和传输的常见方法。序列化是将对象的状态转换为字节流的过......
  • LeetCode: 673.最长子序列的数量 动态规划 时间复杂度O(n*n)
    673.最长子序列的数量LeetCode原题连接673.最长子序列的数量题目描述给定一个未排序的整数数组,找到最长递增子序列的个数。示例1:输入:[1,3,5,4,7]输出:2解释:有两个最长递增子序列,分别是[1,3,4,7]和[1,3,5,7]。示例2:输入:[2,2,2,2,2]输出:5......
  • 代码随想录训练营day41|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股
    121.买卖股票的最佳时机这题和贪心中的买股票很想,但这里不用考虑局部问题,因为只用买一张卖一张。我想可以用一个数组dp来记录买入价格和卖出价格。然后遍历数组草我感觉我写的想贪心。动态规划dp[i][0]表示第i天不持股的最大收益,dp[i][1]表示第i天持股的最大收益。dp......
  • 【代码随想录Day13】二叉树Part01
    理论基础文章讲解:代码随想录二叉树节点的定义:publicclassTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(){}TreeNode(intval){this.val=val;}TreeNode(intval,TreeNodeleft,TreeNoderight){this.val......
  • 115. 不同的子序列(leetcode)
    https://leetcode.cn/problems/distinct-subsequences/submissions/563375885/这题比较有难度,具体不太好想到,需要以是否选择s[i]来划分子集这位描述的很清楚,不做过多赘述classSolution{publicintnumDistinct(Strings,Stringt){//f[i][j]表示s中前i个......
  • RapidJSON 的坑--允许Object对象存在相同的key,且key为数字时序列化报异常
    RapidJSON的坑--允许Object对象存在相同的key,且key为数字时序列化报异常测试代码如下:1voidshow(rapidjson::Document&doc)2{3printf("-----------------foriterator\nMemberCount:%d\n",doc.MemberCount());4for(autoit=doc.MemberBegin();it!=doc......
  • 代码随想录算法 - 二叉树
    题目1226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在[0,100]内-100<=Node.val......
  • 代码随想录day 56 || 图论6
    Prim算法应用场景是主要是找到一个无向连通图的最小生成树,即连接所有节点且权重总和最小的树//prim三部曲//1,找到距离当前最小树最近节点//2,节点入树//3,更新mindist//更新树funcupdateMinDist(edges[][]int,nodeint){ for_,edge:=rangeedges{ ifed......