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;
    }
};
  • 投机省事要仔细
相关推荐
手握风云-21 分钟前
优选算法的妙思之流:分治——快排专题
数据结构·算法
熬夜苦读学习29 分钟前
Linux进程信号
linux·c++·算法
白白糖32 分钟前
二叉树 递归
python·算法·力扣
jyyyx的算法博客43 分钟前
Leetcode 857 -- 贪心 | 数学
算法·leetcode·贪心·嗜血
ChoSeitaku1 小时前
NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)
算法·矩阵·蓝桥杯
l1n3x1 小时前
编译原理前端-词法分析
算法·编译原理
一只天蝎的晋升之路1 小时前
基础算法之:动态规划
算法·动态规划
KangkangLoveNLP2 小时前
手动实现一个迷你Llama:使用SentencePiece实现自己的tokenizer
人工智能·深度学习·学习·算法·transformer·llama
luckyme_2 小时前
leetcode-代码随想录-哈希表-哈希理论基础
leetcode·哈希算法·散列表
独好紫罗兰2 小时前
洛谷题单3-P1420 最长连号-python-流程图重构
开发语言·python·算法