线性DP题目汇总(持续更新)

这篇具有很好参考价值的文章主要介绍了线性DP题目汇总(持续更新)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

此篇章主要整理一些关于线性dp的题目,很多题目其实都可以被挂上线性dp的标志,比如最熟悉的最长上升子序列啊,最长公共子序列啊等等,并且线性dp在自己写力扣周赛的题目的时候,真的会时不时出几道,然后刚好利用这些题目加上dp分析的方法,把题目好好写一写。

二、题目汇总

①力扣2369.检查数组是否存在有效的划分

(1)题目描述

线性DP题目汇总(持续更新)

(2)dp分析

线性DP题目汇总(持续更新)

状态转移方程:
f [ i ] = O r { f [ i − 2 ] , i ≥ 2 & & n u m [ i − 1 ] = n u m [ i − 2 ] f [ i − 3 ] , i > = 3 & & n u m [ i − 1 ] = n u m [ i − 1 ] = n u m [ i − 2 ] f [ i − 3 ] , i > = 3 & & n u m [ i − 1 ] − n u m [ i − 2 ] = n u m [ i − 2 ] − n u m [ i − 3 ] = = 1 f[i]=Or \begin{cases} f[i-2], i\ge2\&\&num[i-1]=num[i-2] \\\\ f[i-3],i>=3\&\&num[i-1]=num[i-1]=num[i-2] \\\\ f[i-3],i>=3\&\&num[i-1]-num[i-2]=num[i-2]-num[i-3]==1 \end{cases} f[i]=Or f[i2],i2&&num[i1]=num[i2]f[i3],i>=3&&num[i1]=num[i1]=num[i2]f[i3],i>=3&&num[i1]num[i2]=num[i2]num[i3]==1
这个状态转移代表什么呢?

其实就是说,当我们选择第i个数的时候,如果在第 i − 2 i-2 i2或者第 i − 3 i-3 i3个数字前的划分都是正确的,那么我们选择i个数,满足三个条件中的时候,我们就可以有一个合理的划分。举一个例子,假设我们的数组是 [ 1 , 1 , 1 , 2 , 3 ] [1,1,1,2,3] [1,1,1,2,3],不难发现,对于1这个数字来说,划分有两种,既可以有前两个1组成一组,也可以是前3个1,因此 f ( 2 ) , f ( 3 ) f(2),f(3) f(2),f(3)都是True,而我们在i等于5的时候,我们此时就可以利用条件3,发现是递增的,那么我们在推导的时候, f ( 5 ) ∣ ∣ f ( 5 − 3 ) = T r u e f(5) || f(5-3)=True f(5)∣∣f(53)=True,因此最终是可以成功划分的。

状态初始化

f [ 0 ] = t r u e , f [ 1 ] = f a l s e f[0]=true, f[1]=false f[0]=true,f[1]=false

因为第0个划分不需要划分也是正确的,这个也是推出其他是否正确的一个必要条件。

最终结果: f [ n ] f[n] f[n]

时间复杂度: O ( N ) O(N) O(N)

(3)完整AC代码
class Solution {
public:
    bool validPartition(vector<int>& nums) {
        int n = nums.size();
        vector<bool> f(n + 1, false);
        f[0] = true;

        for(int i = 2; i <= n; i ++ ) {
            if(nums[i - 1] == nums[i - 2]) f[i] = f[i] || f[i - 2];
            if(i >= 3) {
                if(nums[i - 1] == nums[i - 2] && nums[i - 2] == nums[i - 3])
                    f[i] = f[i] || f[i - 3];
                if(nums[i - 1] - nums[i - 2] == 1 && nums[i - 2] - nums[i - 3] == 1)
                    f[i] = f[i] || f[i - 3];
            }
        }

        return f[n];
    }
};

②力扣2370.最长理想子数组

(1)题目描述

线性DP题目汇总(持续更新)

(2)dp分析

线性DP题目汇总(持续更新)

状态转移方程:
f ( i , j ) = m a x { f ( i − 1 , j ) , 不选择第 i 个字符的情况 f ( i − 1 , [ m a x ( j − k , 0 ) , m i n ( j + k , 25 ) ] ) , 选择第 i 个字符的情况 f(i,j)=max \begin{cases} f(i-1,j),不选择第i个字符的情况 \\\\ f(i-1,[max(j-k,0),min(j+k,25)]),选择第i个字符的情况 \end{cases} f(i,j)=max f(i1,j),不选择第i个字符的情况f(i1,[max(jk,0),min(j+k,25)]),选择第i个字符的情况
相关分析:

这个转移和最长上升子序列的那个dp非常的像,所以也就告诉我们,这个题目其实可以利用一维进行dp,当然下面的代码也会展现出二维的代码,就是二维的比较蛋疼,因为,每一层转移的时候,都需要把所有字符在上一层的状态迁移到本层,最终得到的结果才可以在最后一层里面推出来。

最终结果: m a x ( f [ n ] [ i ] , 0 ≤ i ≤ 25 ) max(f[n][i], 0\leq i \leq 25) max(f[n][i],0i25)

时间复杂度: O ( n ∗ ( 26 + 2 ∗ k ) ) O(n*(26 + 2 * k)) O(n(26+2k))文章来源地址https://www.toymoban.com/news/detail-401521.html

(3)完整AC代码
//二维代码
class Solution {
public:
    int longestIdealString(string s, int k) {
        int n = s.size();
        int f[100050][26];
        memset(f, 0, sizeof f);
        for(int i = 1; i <= n; i ++ ) {
            for(int j = 0; j < 26; j ++ ) f[i][j] = f[i - 1][j];
            int j = s[i - 1] - 'a';
            for(int p = max(j - k, 0); p <= min(j + k, 25); p ++ ) {
                f[i][j] = max(f[i][j], f[i - 1][p] + 1);
            } 
        }
        int maxn = 0;
        for(int i = 0; i < 26; i ++ ) {
            maxn = max(maxn, f[n][i]);
        }

        return maxn;
    }
};

//一维代码
class Solution {
public:
    int longestIdealString(string s, int k) {
        vector<int> f(26, 0);
        for(auto c : s) {
            int j = c - 'a';
            f[j] = f[j] + 1;
            for(int i = max(0, j - k); i <= min(25, j + k); i ++ ) {
                if(i != j) f[j] = max(f[j], f[i] + 1);
            }
        }
        int maxn = 0;
        for(auto t : f) maxn = max(t, maxn);
        return maxn;
    }
};

到了这里,关于线性DP题目汇总(持续更新)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PCL自学:目录】PCL简介及主要功能模块介绍 (持续更新)

    当你知道一切都不重要时,世界就是你的了。 ——《瑞克和莫蒂》S3E8   对于从事计算机视觉、机器视觉领域的从业者来说,OpenCV库并不陌生,甚至是我们入门这个领域时的学习的第一个开源库,如果说OpenCV是二维信息处理方面的工兵铲,那PCL(Point Cloud Library)就是在三维

    2024年02月06日
    浏览(30)
  • 2023年毕业设计 微信小程序题目参考(持续更新)

    大家好,我是 程序员徐师兄 ,最近有很多同学咨询,说毕业设计了,不知道选怎么题目好,有哪些是想需要注意的。 今天,我整理了一些微信小程序毕业设计的题目,可以参考一下,希望对大家有所帮助 微信小程序,现在是非常热门的,基于微信生态开发的。现在很多计算

    2024年02月08日
    浏览(47)
  • 100道基于Android毕业设计的选题题目,持续更新

    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 大家好,我是程序员徐师兄、今天给大家谈谈基于android的app开发毕设题目,以及基于android的毕业设计开题报告对应的

    2024年02月04日
    浏览(35)
  • 安全行业招聘信息汇总——持续更新!

    (1)安全攻防工程师 职位描述 1、负责上线安全测试(黑盒、白盒)、例行安全检查、渗透测试、APP安全测试等工作; 2、制订研发流程中的安全规范,监督和保障安全规范的实施; 3、负责SDLC流程落地,深入业务技术及架构,左移解决安全风险; 4、对标国际信息安全最佳

    2024年02月05日
    浏览(33)
  • JAVA 基础算法汇总(持续更新)

    目录 前言 一、查找算法 1.顺序查找(线性查找) 2.二分查找 二、排序算法 1.冒泡排序 2.直接选择排序 3.插入排序 4.直接插入排序 · · · 三、链表的基础操作 1.链表的创建 2.移除链表元素 3.设计链表 4.ListNode temp = head 与  ListNode dumpyNode = new ListNode(0) 的区别 四、树的基础操作

    2024年02月04日
    浏览(29)
  • 2022前端面试题汇总(持续更新中~)

    目录 1. 防抖和节流 2. js闭包 vue中的data为什么是一个函数?(面试常问) 3. ES6面试题 3.1 var let const 区别 3.2 解构  3.3 如何利用es6快速的去重? 3.4 Promise 面试题 以下代码的执行结果是? 4. Vue相关 4.1 MVC和MVVM的区别 4.2 v-model 原理 4.3  vue中的data为什么是一个函数?(面

    2023年04月08日
    浏览(51)
  • 深度学习常见模型大小汇总(持续更新...)

    本篇博客将记录深度学习领域常见模型的大小,具体算法如下 模型可能来自于PyTorch官方,HuggingFace等。 如有错误或者建议欢迎在评论区指出。 第三方库 版本 transformers 4.30.2 PyTorch 2.0.1 Encoder-Only架构 模型 来源 总参数量 总参数量 BERT-base HuggingFace 109,482,240 109.5M BERT-large Huggin

    2024年02月13日
    浏览(27)
  • Hyperledger Fabric问题汇总(持续更新)

    Ubuntu 20.04 Hyperledger Fabric 2.3.3 SDK对应的Go 1.17.5 链码对应的Go 1.18 Fabric-sdk-go 1.0.0 Docker 20.10.12 Docker-Compose 2.11.2 调用命令: peer chaincode invoke -o localhost:7050 – ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts

    2023年04月15日
    浏览(31)
  • 线性代数复习公式整理(自用/持续更新)

    设A、B为n阶矩阵 ∣ A T ∣ = ∣ A ∣ left | A^T right | =left | A right | ​ A T ​ = ∣ A ∣ ∣ A m ∣ = ∣ A ∣ m left | A^m right | =left | A right | ^m ∣ A m ∣ = ∣ A ∣ m ∣ k A ∣ = k n ∣ A ∣ left | kA right | =k^nleft | A right | ∣ k A ∣ = k n ∣ A ∣ ∣ A B ∣ = ∣ A ∣ ∣ B ∣ left | AB right |

    2024年02月13日
    浏览(34)
  • CTF-XXE(持续更新,欢迎分享更多相关知识点的题目)

    进来看到 然后一起看 Write 进来看到 一起看 write 反正是XXE 直接整 write 不整花里胡哨,解题在最下面 write 与博主不同,我通过下面的语句得到了三个地址,其中两个通过c段扫描可以直接出来flag。 flag出来了,输入平台却不对

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包