当前位置: 首页 > article >正文

动态规划29:673. 最长递增子序列的个数

动态规划解题步骤:

1.确定状态表示:dp[i]是什么

2.确定状态转移方程:dp[i]等于什么

3.初始化:确保状态转移方程不越界

4.确定填表顺序:根据状态转移方程即可确定填表顺序

5.确定返回值

题目链接:673. 最长递增子序列的个数 - 力扣(LeetCode)

题解:

1.状态表示: len[i]表示以nums[i]结尾的最长递增子序列的长度

                      count[i]表示以nums[i]结尾的最长递增子序列个数

2.状态转移方程:见代码分析

3.初始化:len表和count表的最低值为1,所以在创建表时就将其全部初始化为1

4.填表顺序:从左向右依次填写

5.返回值:一次循环,遍历len表,如果当前len值大于已确定的最大长度,更新最大长度并记录返回值ans为count[i];如果当前len值等于已确定的最大长度,返回值ans+=count[i];否则无需更新

class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        //len[i]表示以nums[i]结尾的最长递增子序列的长度
        //如果存在nums[i]>nums[j] len[i]=max(len[i],len[j]+1)
        //如果不存在,len[i]=1
        //count[i]表示以nums[i]结尾的最长递增子序列个数
        //如果存在nums[i]>nums[j]并且len[j]+1>len[i] count[i]=count[j]
        //如果存在nums[i]>nums[j]并且len[j]+1=len[i] count[i]+=count[j]
        //如果存在nums[i]>nums[j]并且len[j]+1<len[i] 无需更新count[i]
        //如果不存在,count[i]=1
        size_t n=nums.size();
        //创建dp表
        vector<int> len(n,1),count(n,1);
        //初始化
        //len表和count表的最低值为1,所以创建表时就初始化
        //填表
        int ans=0,max=0;//max为最长递增子序列的长度
        for(int i=0;i<n;++i)
        {
            for(int j=0;j<i;++j)
            {
                if(nums[i]>nums[j])
                {
                    //更新count表
                    if(len[j]+1>len[i])
                    {
                        len[i]=len[j]+1;//更新len表
                        count[i]=count[j];//更新count表
                    }
                    else if(len[j]+1==len[i])
                    {
                        count[i]+=count[j];//更新count表
                    }               
                }
            }
            //返回值
            if(len[i]>max)
            {
                max=len[i];
                ans=count[i];
            }
            else if(len[i]==max)
            {
                ans+=count[i];
            }
        }
        //返回值
        return ans;
    }
};

http://www.kler.cn/a/395491.html

相关文章:

  • 机器学习-35-提取时间序列信号的特征
  • 物料数据对接:轻易云助力聚水潭与金蝶云星空集成方案
  • 入侵排查之Linux
  • Vue 组件通信及进阶语法
  • 卷积、频域乘积和矩阵向量乘积三种形式之间的等价关系与转换
  • Java NIO 深度解析:构建高效的 I/O 操作
  • python如何实现多态
  • 博客摘录「 pyqt 为新建子线程传参以及子线程返回数据到主线程」2023年12月7日
  • SkyWalking-安装
  • 权限相关知识
  • python os.path.basename(获取路径中的文件名部分) 详解
  • python爬虫初体验(五)—— 边学边玩小游戏
  • 字节青训营 数字魔法的加一操作
  • 自定义call方法和apply方法
  • element plus的表格内容自动滚动
  • 基于ChatGPT 的人工智能代理挖掘化学文献的演变探索
  • 4.远程访问及控制
  • Pandas数据透视表:交叉分析与聚合计算
  • 民锋科技量化模型助力衍生品市场的智能化决策
  • 智谱AI清影升级:引领AI视频进入音效新时代
  • 力扣.15 三数之和 three-sum
  • 英语每日一句
  • 【3D Slicer】的小白入门使用指南一
  • 无人机遥控器基础讲解——CKESC电调小课堂08
  • 【计算机网络】设备如何监听 ARP 请求广播
  • 本地部署Apache Answer搭建高效的知识型社区并一键发布到公网流程