Coding Caprice - dynamic programming11

1143. 最长公共子序列

cpp 复制代码
class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int t1 = text1.size();
        int t2 = text2.size();
        vector<vector<int>> dp(t1+1, vector<int> (t2+1, 0));
        for(int i=1; i<t1+1; ++i){
            for(int j=1; j<t2+1; ++j){
                if(text1[i-1] == text2[j-1]){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }else{
                    dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
                }
            }
        }
        return dp[t1][t2];
    }
};

1035. 不相交的线

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

53. 最大子数组和

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int out = *max_element(nums.begin(), nums.end());
        if(out<0){return out;}
        int startid = 0;
        while(startid<nums.size() && nums[startid]<0){
            startid++;
        }
        int dp_last = nums[startid];
        int sum_tmp = 0;
        int dp = out;
        for(int i=startid+1; i<nums.size(); ++i){
            if(nums[i]<0){
                sum_tmp += nums[i];
            }else{
                int tmp = dp_last + nums[i] + sum_tmp;
                dp = max(tmp, nums[i]);
                out = max(out, dp);
                sum_tmp = 0;
                dp_last = dp;
            }
        }
        return out;
    }
};

动规只考虑一个方向就可以了

392. 判断子序列

cpp 复制代码
class Solution {
public:
    bool isSubsequence(string s, string t) {
        while(s.size()!=0 && t.size()!=0){
            if(t.back() == s.back()){
                s.pop_back();
            }
            t.pop_back();
        }
        return s.size()==0;
    }
};
  • 投机省事要仔细
相关推荐
人道领域18 分钟前
AI抢人大战:谁在收割你的红包
大数据·人工智能·算法
TracyCoder12337 分钟前
LeetCode Hot100(34/100)——98. 验证二叉搜索树
算法·leetcode
A尘埃37 分钟前
电信运营商用户分群与精准运营(K-Means聚类)
算法·kmeans·聚类
power 雀儿2 小时前
掩码(Mask)机制 结合 多头自注意力函数
算法
会叫的恐龙2 小时前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串
小糯米6012 小时前
C++顺序表和vector
开发语言·c++·算法
We་ct2 小时前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
Lionel6892 小时前
分步实现 Flutter 鸿蒙轮播图核心功能(搜索框 + 指示灯)
算法·图搜索算法
小妖6662 小时前
js 实现快速排序算法
数据结构·算法·排序算法
xsyaaaan2 小时前
代码随想录Day30动态规划:背包问题二维_背包问题一维_416分割等和子集
算法·动态规划