代码随想录算法训练营第五十三天

今天同事说他要离职啦,还挣挺多的,我也慢慢努力吧!!

儿子似乎有点斜颈,还好不是很大的病,儿子也开始面对人生的苦难啦。都好好加油生活!

1143.最长公共子序列

二维可以理解一点。

cpp 复制代码
class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        vector<vector<int>>dp(text1.size() + 1,vector(text2.size() + 1,0));
        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],dp[i][j-1]);
                }
            }
        }
        return dp[text1.size()][text2.size()];
    }
};

1035.不相交的线

其实就是和1143一模一样,只要顺序相同,就可以实现不相交。

cpp 复制代码
class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>>dp(nums1.size() + 1,vector(nums2.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[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()];
    }
};

一维数组的思路很难其实,暂且放一下,先做下一题。

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>
using namespace ::std;
class Solution
{
public:
    int longestCommonSubsequence(string text1, string text2)
    {
        // 首先要用text2的长度
        vector<int> dp(text2.size() + 1, 0);
        for (int i = 1; i <= text1.size(); i++)
        {
            int pre = dp[0];
            for (int j = 1; j <= text2.size(); j++)
            {
                int cur = dp[j];
                if (text1[i - 1] == text2[j - 1])
                {
                    dp[j] = pre + 1;
                }
                else
                {
                    dp[j] = max(dp[j], dp[j - 1]);
                }
                pre = cur;
            }
            cout << i << endl;
            for (int j = 0; j <= text2.size(); j++)
            {
                cout << dp[j] << ' ';
            }
            cout << endl;
        }
        return dp[text2.size()];
    }
};
int main()
{
    Solution syz;
    string text1 = "abcde";
    string text2 = "ace";
    syz.longestCommonSubsequence(text1, text2);
    return 0;
}

//这里pre相当于dpi - 1j - 1
结果如下,可以对齐二维的情况:

cpp 复制代码
1
0 1 1 1
2
0 1 1 1
3
0 1 2 2
4
0 1 2 2
5
0 1 2 3

53. 最大子序和

和贪心思路很像。

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int>dp(nums.size(),0);
        dp[0] = nums[0];
        int result = 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;
    }
};
相关推荐
罗西的思考4 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer4 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
文丑颜不良啊5 小时前
LeetCode51~75题目解析
leetcode
高晶5 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
ysbfsy6 小时前
大数计算思路
算法
高晶6 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
学电子她就能回来吗6 小时前
LeetCode Hot 100|普通数组专题学习笔记(零基础版)
笔记·算法·leetcode
用户老李6 小时前
反向传播计算梯度举例
算法
niyongsheng6 小时前
多智能体连续时间内路径规划:AA-SIPP(m) 的 Rust 实现与算法
算法·rust·机器人
302wanger7 小时前
DeepSeek-V4.1-Flash-1017 免费用到1024,速来
算法