首页 > 其他分享 >求出最长好子序列

求出最长好子序列

时间:2024-09-07 10:48:09浏览次数:11  
标签:好子 seq nums int 最长 vector 序列 mx

给你一个整数数组 nums 和一个 非负 整数 k 。
如果一个整数序列 seq 满足在范围下标范围 [0, seq.length - 2] 中存在 不超过 k 个下标 i 满足 seq[i] != seq[i + 1] ,那么我们称这个整数序列为好序列。
请你返回 nums 中好子序列的最长长度

1. 动态规划

dp[i][j]表示将把i作为序列最后放进去,不超过j个不符合要求的最长好序列长度
这里需要三重循环,因为每次还要遍历前面的进行判断和转移

class Solution {
public:
    int maximumLength(vector<int>& nums, int k) {
         //小于等于k个,不等,相等不计数
        int n = nums.size();
        //dp[i][j]表示将把i作为序列最后放进去,不超过j个不符合要求的最长好序列长度
        vector<vector<int>> dp(n+1,vector<int>(k+1,1));
        int res = 1;
        for(int i=1;i<n;i++){//遍历数组每一个数,作为序列结尾
            for(int j=0;j<i;j++){//根据前面情况进行转移
                //如果相同,则不占据指标,不同则需要占据一个指标
                if(nums[i]==nums[j]){
                    for(int l=0;l<=k;l++)
                        dp[i][l] = max(dp[i][l],dp[j][l]+1);//序列长度增加
                }
                else{
                    for(int l=1;l<=k;l++)
                        dp[i][l] = max(dp[i][l],dp[j][l-1]+1);//序列长度增加
                }
            }
            res = max(res,dp[i][k]);
        }
        return res;
    }
};

2. 动态规划优化

缩减为两重循环,将逐个与前面序列判断去掉,直接转移,需要记录相同值的最大值,和不同值的最大值

class Solution {
public:
    int maximumLength(vector<int>& nums, int k) {
        unordered_map<int, vector<int>> fs;
        vector<int> mx(k + 2);
        for (int x : nums) {
            auto& f = fs[x];//对应相同值x的数组
            f.resize(k + 1);//初始化
            for (int j = k; j >= 0; j--) {
                f[j] = max(f[j], mx[j]) + 1;
                mx[j + 1] = max(mx[j + 1], f[j]);
            }
        }
        return mx[k + 1];
    }
};

标签:好子,seq,nums,int,最长,vector,序列,mx
From: https://www.cnblogs.com/929code/p/18401421

相关文章

  • 如何快速求一个序列的gcd和lcm
    背景:教授在打某道关于序列gcd与lcm的题,但是看不懂题解,于是决定打表找规律;然而自己又懒得算数,于是写了个程序。使用说明:输入格式:nstra1a2...an,\(n\)为序列长度;str为操作种类,只有GCD和LCM;\(a\)为序列,其中所有元素都必须是自然数。如果输入不合法,程序会中断计算并返回错误......
  • 机器学习、生成式AI和深度学习时间序列模型(含代码)
    作者:老余捞鱼原创不易,转载请标明出处及原作者。写在前面的话:    本文转自一篇论文,主要讨论了在不同行业中时间序列预测的重要性,以及如何利用机器学习、生成式人工智能(GenerativeAI)和深度学习来提高预测的准确性。时间序列数据是按特定时间间隔收集或记录的数据点......
  • 基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
    1.程序功能描述   奇异谱分析(SingularSpectrumAnalysis,简称SSA)是一种强大的非线性和非参数时间序列分析方法。该方法基于奇异值分解(SVD)和轨迹矩阵的概念,用于提取时间序列中的趋势、周期性和噪声成分。在本课题中,通过SSA算法,从强干扰序列中提取其趋势线。2.测试软件版本......
  • 基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
    1.程序功能描述奇异谱分析(SingularSpectrumAnalysis,简称SSA)是一种强大的非线性和非参数时间序列分析方法。该方法基于奇异值分解(SVD)和轨迹矩阵的概念,用于提取时间序列中的趋势、周期性和噪声成分。在本课题中,通过SSA算法,从强干扰序列中提取其趋势线。2.测试软件版本以及......
  • AbMole|DNA双链断裂修复中的序列与染色质特征:MRX复合体的作用与机制
     在生物学领域中,DNA双链断裂(DSB)作为一种极具破坏性的基因组损伤,其准确且高效的修复对于维持细胞基因组的稳定性和功能至关重要。由来自哥伦比亚大学欧文医学中心微生物学与免疫学系的RobertGnügge和瑞士苏黎世工业大学(ETH)生物化学研究所生物系的 GiordanoReginato,Petr......
  • 用Python实现时间序列模型实战——Day 11: 指数平滑模型
    一、学习内容1.简单指数平滑法简单指数平滑法:简单指数平滑法(SimpleExponentialSmoothing,SES)是一种用于平滑时间序列数据的技术,通过对数据赋予不同的指数权重,较新的数据点权重更高。SES适用于平稳的时间序列数据,即没有显著趋势和季节性成分的时间序列。SES模型的......
  • 每日OJ_牛客_最长递增子序列(dp/贪心模板)
    目录牛客_最长递增子序列(dp/贪心模板)解析代码牛客_最长递增子序列(dp/贪心模板)最长公共子序列__牛客网解析代码在一个序列中找最长递增子序列,动态规划的典型应用,下面是两个模版CISdp模板:#include<iostream>#include<vector>usingnamespacestd;intLIS(vect......
  • 最大上升子序列 II
    序列:可以不连续,但与原数列当中出现的先后顺序要相同;上升子序列:需要满足单调性-单调递增算法1(贪心+二分)O(nlogn)时间复杂度二分查找一个数的最小的最大值O(logn);一共有n个数进行二分O(nlogn);贪心分析样例:731218561.首先分析长度为1的上升子序列—......
  • java 二次反序列化
    java二次反序列化SignedObject该类是java.security下一个用于创建真实运行时对象的类,更具体地说,SignedObject包含另一个Serializable对象。先看其构造函数方法。看到参数接受一个可序列化的对象,然后又进行了一次序列化,继续看到该类的getObject方法(这是个getter方法......
  • NOIP2024集训Day20 DP常见模型1 - 序列
    NOIP2024集训Day20DP常见模型1-序列A.[JOI2022Final]Let'sWintheElection贪心+DP。首先,一定是所有协作者同时在同一个州演讲,这样才最优。然后,假设我们已经知道所有州的方案(支持、支持+协作、反对),那我们一定是先按照从小到大的顺序拿下所有“支持+协作”州,这样最优。......