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

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

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

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相当于dp[i - 1][j - 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;
    }
};
相关推荐
泉崎9 分钟前
11.7比赛总结
数据结构·算法
你好helloworld10 分钟前
滑动窗口最大值
数据结构·算法·leetcode
AI街潜水的八角1 小时前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
白榆maple1 小时前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少1 小时前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs111 小时前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
此生只爱蛋2 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp2 小时前
Java:数据结构-枚举
java·开发语言·数据结构
昂子的博客3 小时前
基础数据结构——队列(链表实现)
数据结构
咕咕吖3 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展