动态规划—— 最长上升子序列模型 解题记录

这篇具有很好参考价值的文章主要介绍了动态规划—— 最长上升子序列模型 解题记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一些想法:

        现在是2024-3-15 06:01:22 哈哈卷死我可爱的舍友们~ 这两天又想起来开学的时候立下的刷完kuangbin专题的flag(快进到干不完) 总是先把Acwing的提高课看完吧 每天这样干一点总能干完的hhhhh,这会在喝npy买的奶茶,超多椰果真的好喝爱了爱了。

解题报告:

        今天是最长上升子序列模型,模型本身难度不高,利用yxc的解题方法就可以分解为以下条件:

1. 集合表示方法: f[i] 表示从这一序列的第一项到第 i 项为止的所有可能的方案。

2. 集合表示属性: 长度的最大值 总和的最大值

最核心的代码如下:(按照题目条件稍加修改可以过掉下面两道题)

 

for(int i = 1; i<=n ;i++)
{
    f[i]= 1;//赋初值 保证至少长度为1 即本身
    for(int j =1 ;j<i ;j++)
    {
        if(a[i] > a[j]) f[i] = max(f[i], f[j]+1);
    }
}

AcWing 1017. 怪盗基德的滑翔翼

AcWing 1014. 登山

        然后是几道需要将原题目转化为最长上升子序列模型的题目。

        合唱队形求一个带峰值的最长队伍,我们可以通过将每个人视为以他为左上升的子序列的右端点的同时视作右上升的子序列的左端点来找到最大的一个目标队形,记得减去被重复计算的这个人本身。

        友好城市求最多可以批准的城市数量,思考形成最长上升子序列的过程,只有在当前考虑的一层循环的值的左边的值,即序号比它小的值才可以被考虑是否可以用来更新最大值。友好城市就是如此,我们将河岸一边的城市进行正序排序,只有当另一边的建桥方案无冲突即也是正序时才是合法方案,那么可以使用pair来保证只使用两个序号都比这一组小的值来更新最大方案。

        最大上升子序列和比较简单,是对模型的变形,从求最长的子序列变成最大的子序列。

AcWing 482. 合唱队形

AcWing 1012. 友好城市

AcWing 1016. 最大上升子序列和

        随后是两道剧情连续的题目。(痛苦降临)

        拦截导弹。第一问就是最长上升子序列。第二问用贪心思路,从前往后扫描每个数,对每个数做判断,如果不存在比它小的数 (一个新的最大值) 那么就新开一个子序列 (新的系统),如果存在,则找到一个结尾比它大的数列,放在这个数的后面 (可以通过二分优化) 。最后第一问输出最长的序列的长度,第二问输出创建的系统总数即可。

        导弹防御系统。迭代加深,利用一个dfs参数depth来记录上升系统与下降系统的和。从depth=1开始,不断depth++直到得到一个合法的能包容上升与下降系统的和的解。

        dfs过程中,暴力搜索将每个元素放到上升那一坨还是下降那一坨系统中

        当满足第一个比新加入的元素的(上升或下降系统的)条件就把这个元素加进去,与上一题的贪心解法是相同的

        如果没找到这样一个放入的方法的解,那么就拓宽队列的长度,直到放入上升和下降都不行的话,那么返回false

        看代码会好理解一点,懒得写了(bushi)

AcWing 1010. 拦截导弹

AcWing 187. 导弹防御系统

        最后是一道组合题,求最长公共上升子序列。

        本题使用公共子序列的状态表示, f[i][j] 表示 a 的前 i 个元素中和 b 的前 j 个元素中,以b[j] 为结尾的方案,存的是方案中的上升子序列的长度的最大值。

        将方案话划分为:

        1. 不选 a[i] 的子集 直接符合定义 f[i-1][j]

        2. 选了 a[i] 的子集 前提是a[i] ==  b[j]

                然后确定最大值的转移,当 b[k] < b[j] (满足上升条件)时 才能用来更新最大值,然后我们 要求这些前 1~j-1 中的最大值。

        时间复杂度上 状态表示为 状态计算为 n 所以总的时间复杂度是

        注意到我们在状态计算的时候,求的来的 b[1~j] 的最大值是前缀最大值,在往后计算时会重复计算,也即最大值会在计算 b[1] 开始向后传递,同时 只有当这个数已经小于我们现在正在看的 a[i] 时才能加入计算前缀最大值的行列中,所以我们开一个值 maxv ,当 a[i]>b[j] 时就记录这样的前缀最大值即可。

优化前:

for (int i = 1; i <= n; i ++ )
    for (int j = 1; j <= n; j ++ )
    {
        f[i][j] = f[i - 1][j];
        if (a[i] == b[j])
        {

            int maxv = 1;
            for (int k = 1; k < j; k ++ )
                if (b[j] > b[k])
                    maxv = max(maxv, f[i - 1][k] + 1);

            f[i][j] = max(f[i][j], maxv);
        }
    }

优化后:

    for (int i = 1; i <= n; i ++ )
    {
        int maxv = 1;
        for (int j = 1; j <= n; j ++ )
        {
            f[i][j] = f[i - 1][j];
            if (a[i] == b[j]) f[i][j] = max(f[i][j], maxv);
            if (a[i] > b[j]) maxv = max(maxv, f[i - 1][j] + 1);
        }
    }
心得:

        两道导弹题目当初学的时候真是要了老命,写这篇博客的时候还琢磨了一个钟,还是太菜(幸好最后搞懂了)。首次遇到了迭代加深的题,多看多学。

        文章来源地址https://www.toymoban.com/news/detail-849647.html

到了这里,关于动态规划—— 最长上升子序列模型 解题记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 动态规划__最长上升子序列

    目录 一.最长上升子序列 最长上升子序列模板 O(n ^ 2) 最长上升子序列二分优化 O(nlongn) 1017. 怪盗基德的滑翔翼 1014. 登山 1012. 友好城市 1016. 最大上升子序列和 1010. 拦截导弹 187. 导弹防御系统 二.最长公共上升子序列 最长公共子序列 最长公共上升子序列 给定一个长度为 N 的数

    2024年02月04日
    浏览(41)
  • C++动态规划之最长上升子序列

    一个序列A={a1,a2,...an}中任意删除若干项,剩余的序列叫做A的一个子序列。例如序列A={1,3,5,4,2},删除其中的第3项和第5项,得到序列B={1,3,4},删除其中的第3项和第4项,得到序列C={1,3,2},此时序列B和C是序列A的子序列。 如果序列中的元素是从小到大排列的,则该序列为上升

    2023年04月14日
    浏览(46)
  • C++---最长上升子序列模型---最大上升子序列和(每日一道算法2023.3.3)

    注意事项: 本题为\\\"线性dp—最长上升子序列的长度\\\"的扩展题,所以dp思路这里就不再赘述。 题目: 比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等。 这些子序列中和最大为18,为子序列(1,3,5,9)的和。 你的任务,就是对于给定的序列,求出最大上升子序

    2024年02月03日
    浏览(39)
  • 最长上升子序列模型(LIS)

    最长上升子序列模型就像它的名字一样,用来从区间中找出最长上升的子序列。它主要用来处理区间中的挑选问题,可以处理上升序列也可以处理下降序列,原序列本身的顺序并不重要。 895. 最长上升子序列(活动 - AcWing) 896. 最长上升子序列 II(活动 - AcWing) 我们就这两个

    2024年01月19日
    浏览(41)
  • 算法:动态规划——最长公共子序列

    动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的

    2023年04月27日
    浏览(60)
  • 【算法-动态规划】最长公共子序列

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年01月23日
    浏览(47)
  • 动态规划算法 | 最长递增子序列

    通过查阅相关资料 发现动态规划问题一般就是求解最值问题 。这种方法在解决一些问题时应用比较多,比如求最长递增子序列等。 有部分人认为动态规划的核心就是:穷举。因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值。 首先,笔者认为动态规划中

    2024年02月06日
    浏览(54)
  • 两个数组的动态规划——最长公共子序列模型

    1.考虑空串,即dp表多出一行一列, 代表某个字符串为空。 2.考虑最后一个位置;是否相等; 3.可在字符串最前面加虚拟位置以对应映射关系; 4.一般横行是j,列是i。此时第一行代表第二个字符串不为空,即第一个字符串是空的 给你两个字符串  s   和  t  ,统计并返回在

    2024年03月10日
    浏览(65)
  • 【动态规划】最长公共子序列——算法设计与分析

    子序列是给定序列中在任意位置去掉任意多个字符后得到的结果。例如: 给定序列 X X X : X : A B C B D A B X:ABCBDAB X : A BCB D A B X X X 的子序列: X 1 : A B C B D A B X_1:ABCBDAB X 1 ​ : A BCB D A B X 2 : A B C B X_2:ABCB X 2 ​ : A BCB X 3 : A C B B X_3:ACBB X 3 ​ : A CBB 给定两个序列

    2024年02月05日
    浏览(55)
  • (Java) 算法——动态规划 最长公共子序列 图解

    遇到了用动态规划来求解最长公共子序列问题,算法这块儿比较薄弱,便想着在网上找现成的思路和代码,也算拾人牙慧,但有一点没想到,都已经22年了,关于LCS问题网上给出的答案如此一言难尽……,只有零散几篇对于 新手 来说比较友好,但也仅仅这样,好在自己花了点

    2023年04月08日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包