给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。
注意 这个数列必须是 严格 递增的。
- class Solution {
- public:
- int findNumberOfLIS(vector<int>& nums) {
- int n=nums.size();
- vector<int>dp(n,1);
- vector<int>f(n,1);
- int retlength=1;
- int retcount=1;
- for(int i=1;i
- {
- //int length=f[0];//0到i-1区间内的最大长度
- for(int j=0;j
- {
- if(nums[j]
- {
- if(f[j]+1==f[i])dp[i]+=dp[j];
- else if(f[j]+1>f[i])
- {
- dp[i]=dp[j];
- f[i]=f[j]+1;
- }
- }
- }
- if(retlength==f[i])retcount+=dp[i];
- else if(retlength
- {
- retcount=dp[i];
- retlength=f[i];
- }
- }
-
- return retcount;
- }
- };
646. 最长数对链
题目描述:
给你一个由 n 个数对组成的数对数组 pairs ,其中 pairs[i] = [lefti, righti] 且 lefti < righti 。
现在,我们定义一种 跟随 关系,当且仅当 b < c 时,数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面。我们用这种形式来构造 数对链 。
找出并返回能够形成的 最长数对链的长度 。
你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。
解题思路:
算法思路:
这道题⽬让我们在数对数组中挑选出来⼀些数对,组成⼀个呈现上升形态的最⻓的数对链。像不像
我们整数数组中挑选⼀些数,让这些数组成⼀个最⻓的上升序列?因此,我们可以把问题转化成我
们学过的⼀个模型:
300. 最⻓递增⼦序列
。因此我们解决问题的⽅向,应该在「最⻓递增⼦序
列」这个模型上。
不过,与整形数组有所区别。在⽤动态规划结局问题之前,应该先把数组排个序。因为我们在计
算
dp[i]
的时候,要知道所有左区间⽐
pairs[i]
的左区间⼩的链对。排完序之后,只⽤
「往前遍历⼀遍」即可。
1.
状态表⽰:
dp[i]
表⽰以
i
位置的数对为结尾时,最⻓数对链的⻓度。
2.
状态转移⽅程:
对于
dp[i]
,遍历所有
[0, i - 1]
区间内数对⽤
j
表⽰下标,找出所有满⾜
pairs[j]
[1] < pairs[i][0]
的
j
。找出⾥⾯最⼤的
dp[j]
,然后加上
1
,就是以
i
位置为结
尾的最⻓数对链。
3.
初始化:
刚开始的时候,全部初始化为
1
。
4.
填表顺序:
根据「状态转移⽅程」,填表顺序应该是「从左往右」。
5.
返回值:
根据「状态表⽰」,返回整个
dp
表中的最⼤值。
解题代码:
- class Solution {
- public:
- int findLongestChain(vector
int >>& pairs) { - sort(pairs.begin(),pairs.end());
- int n=pairs.size();
- vector<int>dp(n,1);
- for(int i=1;i
- {
- for(int j=0;j
- {
- if(pairs[j][1]
0]) - dp[i]=max(dp[i],dp[j]+1);
- }
- }
- int ret=1;
- for(int i=0;i
- ret=max(ret,dp[i]);
- return ret;
- }
- };
-
相关阅读:
【微信开发】[JAVA实现]微信公众号网页授权登录
深紫色粉末BHQ-1 NHS,916753-61-2,NHS修饰是合成后与一个伯氨基的共轭
lv5 嵌入式开发-12 信号灯
Codeforces Round 896 (Div. 1) C. Travel Plan(树形dp+组合数学)
238. 除自身以外数组的乘积 (前缀和)
网络安全笔记6——数字证书与公钥基础设施
EarthChat SignalR原理讲解
vs 自定义代码块 代码自动生成
6. 【图的存储结构】邻接矩阵、邻接表 、十字链表 、邻接多重表
GitHub获120k+star的阿里内网“疯传”葵花宝典JVM虚拟机调优指南
-
原文地址:https://blog.csdn.net/m0_69061857/article/details/134468115