leetcode 673.最长递增子序列的个数

上一题只需要知道最长递增子序列的长度就行了,那样的话直接一个dp就完事了,但是呢,这里说了需要记录这个最长长度递增子序列的个数,这下的话,如果你想用原先的思路,其实可以,但是要能做到计数的话,需要你再定义一个数组cnt用来记录以nums[i]为尾的最长子序列个数。

思路:首先我们根据最长递增子序列的思路,知道dp是用来记录以nums[i]为尾的最长子序列长度的,那么我们要在动态规划实现递推的同时实现cnt计数。

我们开for循环直接从0开始就行了,因为不需要顾及特殊情况n=0或n=1,由于我们是需要实现nums的数组遍历的,所以从0开始就好。然后就直接照着上一题的思路直接抄上,直到我们判断nums[i]与nums[j]的大小时,开始不一样:

当我们判断nums[i]>nums[j]时,说明我们是可以把当前nums[i]接到以nums[j]为尾的子序列上的,由于我们需要计数的操作,所以不会使用max函数。这时就是判断dp[i]与dp[j]+1的大小,如果后者大,那么就更新dp[i],它的个数cnt[i]也随之更新到cnt[j](cnt[i]在初始时是1,我们直接初始化就行);我们还需要判断dp[i]==dp[j]+1的可能性。为什么呢?当我们加上这nums[i]这一个数的时候这个以nums[j]结尾的子序列才刚刚和dp[i]的个数相等,那也就是相当于子序列长度为dp[i]的子序列又多了cnt[j]个,可以想一下,细品一下。这个时候,cnt[i]+=cnt[j],这时才是dp[i]所代表的个数。

然后在我们判断完dp[i]之后,我们需要做一个比较,也就是对于目前最长长度的比较。如果说这个时候dp[i]比目前最长长度还要大,那么dp[i]就是新的最长长度,那么记录的最长长度递增子序列的个数也就是dp[i]所对应的cnt[i]的个数了,就不用之前的那个个数了,直接覆盖掉。

如果说我们这个时候dp[i]==目前的最长长度,也就是说目前最长长度的子序列个数又多了dp[i]个,和上面的思路一样,直接把当前记录的子序列个数+cnt[i]。这样一直更新代换下去。

上代码:

复制代码
class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        int n=nums.size();
        int res=INT_MIN;
        vector<int>dp(n);
        vector<int>cnt(n);
        int len=0;
        int count=0;
        for(int i=0;i<n;i++){
            dp[i]=1;
            cnt[i]=1;
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]){
                    if(dp[j]+1>dp[i]){
                        dp[i]=dp[j]+1;
                        cnt[i]=cnt[j];
                    }
                    else if(dp[j]+1==dp[i])
                    cnt[i]+=cnt[j];
                }
            }
            if(dp[i]>len){
                len=dp[i];
                count=cnt[i];
            }
            else if(dp[i]==len)
            count+=cnt[i];
        }
        return count;
    }
};
相关推荐
米粒118 分钟前
力扣算法刷题 Day 27
算法·leetcode·职场和发展
Fuxiao___1 小时前
C 语言核心知识点讲义(循环 + 函数篇)
算法·c#
Mr_Xuhhh1 小时前
LeetCode hot 100(C++版本)(上)
c++·leetcode·哈希算法
漫随流水2 小时前
c++编程:反转字符串(leetcode344)
数据结构·c++·算法
穿条秋裤到处跑3 小时前
每日一道leetcode(2026.03.31):字典序最小的生成字符串
算法·leetcode
CoovallyAIHub5 小时前
VisionClaw:智能眼镜 + Gemini + Agent,看一眼就能帮你搜、帮你发、帮你做
算法·架构·github
CoovallyAIHub5 小时前
低空安全刚需!西工大UAV-DETR反无人机小目标检测,参数减少40%,mAP50:95提升6.6个百分点
算法·架构·github
CoovallyAIHub5 小时前
IEEE Sensors | 湖南大学提出KGP-YOLO:先定位风电叶片再检测缺陷,三数据集mAP均超87%
算法
Yupureki6 小时前
《算法竞赛从入门到国奖》算法基础:动态规划-路径dp
数据结构·c++·算法·动态规划
副露のmagic6 小时前
数组章节 leetcode 思路&实现
算法·leetcode·职场和发展