673.最长递增子序列

673.最长递增子序列

思路:动态规划

dp[i]表示numsi时最长递增子序列的长度

初始状态dp0=0;用一个j去遍历以numsi之前所有子序列的起点

cnt[i]记录对应dp下最长子序列的个数

状态转移方程:

(1)如果nums[j] >= nums[i] ,非递增 不考虑

(2)如果nums[j] < nums[i],此时是递增,那么到 i 最长的子序列= 到 j 最长的子序列 + numsidp[i] = dp[j] + 1

对于cnt和maxL的维护

(1)dp[i] > dp[j] + 1时,maxL不变

(2)dp[i] = dp[j] + 1时,maxL相等,且出现长度相同的不同最长子序列,此时cnt需要改变

(3)dp[i] < dp[j] + 1,maxL需要更新变为dp[j] + 1,cnt要重置到新的cnt[j]

cntj的含义为以j做结尾的最长递增子序列个数,

如果cnt[j]=2,再加一个新的nums[i]加入递增子序列,那么cnt[i]的个数是cnt[j]+1,即3

那么在情况(2)中对cnt的维护:遍历j时,有不同的j结尾的子序列新增nums[i]后最大长度相同,那么需要现有的cnt[i]+cnt[j](实际上相当于所有能和nuns[i]组成最长递增子序列的cnt[j]的和,起一个累加效果)

最后再设置一个maxL置,不断比较每一个dpi

(1)maxL<dp[i],更新maxL=dp[i]并重新计数,res=cnt[i]

(2)maxL==dp[i],cnt需要累加,res=res+cnt[i];

(2)maxL>dp[i],无意义

代码:

cpp 复制代码
class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        int n=nums.size();
        //初始化为1,至少单个字符可以当作子序列
        vector<int>dp(n,1);
        vector<int>cnt(n,1);
        int counter=1;
        int maxL=1;
        int res=0;
        for(int i=0;i<n;i++){
           for(int j=0;j<i;j++){
              //递增
              if(nums[i]>nums[j]){
                  //对cnt进行计算
                  if(dp[i]<dp[j]+1){ //最大值变化
                      dp[i]=dp[j]+1;
                      //重置cnt,到j结尾的最大子序列也可能有多个,所以不是重置到1
                      cnt[i]=cnt[j];

                  }else if(dp[i]==dp[j]+1){//最大值相同的多一个
                      //cnt+1
                      cnt[i]=cnt[i]+cnt[j];
                  }
              }
           }
            if(dp[i]>maxL){
                maxL=dp[i];
                res=cnt[i];
            }else if(dp[i]==maxL){
                res=res+cnt[i];
            }
        }
        return res;
    }
};
相关推荐
黎阳之光12 小时前
视频孪生+空天地水工融合,黎阳之光构建智慧水利监测新范式
大数据·人工智能·物联网·算法·安全
cheems952712 小时前
[算法手记] 贪心 爬楼梯问题
算法·贪心算法
KaMeidebaby13 小时前
卡梅德生物技术快报|酵母双杂交 cDNA 文库构建与蛋白互作筛选流程
服务器·前端·数据库·人工智能·算法
sheeta199813 小时前
LeetCode 每日一题笔记 日期:2026.05.27 题目:3121. 统计特殊字母的数量 II
笔记·算法·leetcode
ST——Jess13 小时前
年度行业趋势研究报告:泛心理数字化赛道“流日推演”的算法困境与高保真交互范式重构
人工智能·算法·架构
Tisfy13 小时前
LeetCode 3300.替换为数位和以后的最小元素:一次遍历
数学·算法·leetcode·模拟
garmin Chen13 小时前
LeetcodeHot100打卡(14、合并空间,15、轮转数组,16、除了自身以外数组乘积,17.缺失的第一个整数)
java·笔记·学习·算法
elseif12313 小时前
【C++】vector 详细版
开发语言·c++·算法
变量未定义~14 小时前
既约分数、阶乘约数、逆元、最大质因子个数【算法赛】
算法