动态规划精讲(一)LC 最长递增子序列的个数
最长递增子序列的个数
给定一个未排序的整数数组,找到最长递增子序列的个数。
示例 1:
输入: [1,3,5,4,7]
输出: 2
解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。
示例 2:
输入: [2,2,2,2,2]
输出: 5
解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。
思路:
思路
我们需要定义两个vector数组:
vector<int> dp(n,1): 表示以nums[i]结尾的LIS长度
vector<int> count(n,1): 表示以nums[i]结尾的LIS的组合的个数
这里两个数组全部初始化为1,显然当序列长度为1时,LIS的长度为1,并且所有LIS的个数至少为1(不可能为零)
两重循环遍历
第一重用i扫描(1 <= i < nums.size())
第二重用j扫描(0 <= j < i)
显然 j 永远小于 i
若要LIS成立,我们只要考虑nums[j] < nums[i]的情况,其他情况则不考虑
(1)当dp[j]+1 > dp[i]时,意味着我们第一次找到这个组合
(2)当dp[j]+1 == dp[i]时,意味着我们不是第一次找到这个组合
当我们遇到情况(1)时(dp[j]+1 > dp[i]),只需要将LIS的长度加一,并且将组合数设为与nums[j]一样即可
当我们遇到情况(2)时(dp[j]+1 == dp[i]),只需要将nums[j]的组合数添加上去即可
注意以上两种情况都是基于(nums[j] < nums[i])
最后我们返回所有LIS的所有组合数
class Solution {
public:
int findNumberOfLIS(vector<int>& nums) {
int n = nums.size();
if(n<=0) return n;
vector<int> dp(n, 1);
vector<int> count(n,1); for(int i=1; i<n; i++) {
for(int j=0; j<i; j++) {
if(nums[j] < nums[i]) {
// 第一次找到
if(dp[j]+1 > dp[i]) {
dp[i] = dp[j] + 1;
count[i] = count[j];
// 再次找到
} else if(dp[j]+1 == dp[i]) {
count[i] += count[j];
}
}
}
}
// 最后的返回值应该是所有最大长度的所有count的总和
int max = *max_element(dp.begin(), dp.end());
int res = 0;
for(int i=0; i<n; i++) {
if(dp[i] == max)
res += count[i];
} return res; }
};
动态规划精讲(一)LC 最长递增子序列的个数的更多相关文章
- [Swift]LeetCode673. 最长递增子序列的个数 | Number of Longest Increasing Subsequence
Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...
- Q673 最长递增子序列的个数
给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7] ...
- Leetcode 673.最长递增子序列的个数
最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[ ...
- Java实现 LeetCode 673 最长递增子序列的个数(递推)
673. 最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, ...
- 51Nod:1134 最长递增子序列
动态规划 修改隐藏话题 1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递 ...
- 动态规划 - 最长递增子序列(LIS)
最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...
- 【动态规划】拦截导弹_dilworth定理_最长递增子序列
问题 K: [动态规划]拦截导弹 时间限制: 1 Sec 内存限制: 256 MB提交: 39 解决: 10[提交][状态][讨论版] 题目描述 张琪曼:“老师,修罗场是什么?” 墨老师:“修罗是 ...
- 动态规划----最长递增子序列问题(LIS)
题目: 输出最长递增子序列的长度,如输入 4 2 3 1 5 6,输出 4 (因为 2 3 5 6组成了最长递增子序列). 暴力破解法:这种方法很简单,两层for循环搞定,时间复杂度是O(N2). 动 ...
- 算法之动态规划(最长递增子序列——LIS)
最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...
随机推荐
- WPF MVVM模式下路由事件
一,路由事件下三种路由策略: 1 冒泡:由事件源向上传递一直到根元素.2直接:只有事件源才有机会响应事件.3隧道:从元素树的根部调用事件处理程序并依次向下深入直到事件源.一般情况下,WPF提供的输入事 ...
- MyBaits学习03(ResultMap和分页)
5.ResultMap 5.1 查询为null问题 要解决的问题:属性名和字段名不一致 环境:新建一个项目,将之前的项目拷贝过来 1.数据库里的属性 2.Java中的实体类设计 public clas ...
- ESP32-S2原生USB 烧录 TinyUF2 bootloader 加 CircuitPython
概述 ESP32-S2最令我心仪的改进是原生支持USB,即带有一个集成了收发器的全速 USB OTG 外设,符合 USB 1.1 规范,理论速度1.5m/s,利用得当将会是一个非常巨大的进步. 目前E ...
- ad 差分布线 等长布线
差分要素: 1.原理图差分对名字后缀必须是 _n _p 2.规则改动 定义差分线宽和间距
- 进程之间的通信(multiprocess.Queue)
一.进程间通信 进程之间的数据是相互隔离的,例如 from multiprocessing import Process def task(): global n # 声明全局变量 n = 999 p ...
- noip模拟12[简单的区间·简单的玄学·简单的填数]
noip模拟12 solutions 这次考试靠的还是比较好的,但是还是有不好的地方, 为啥嘞??因为我觉得我排列组合好像白学了诶,文化课都忘记了 正难则反!!!!!!!! 害没关系啦,一共拿到了\( ...
- nginx 部署vue
server { listen 80; server_name localhost; root /www/meiduo_admin/dist; access_log /var/log/nginx/ad ...
- Spring Boot Mybatis注解:@Mapper和@MapperScan
使用@Mapper注解 添加了@Mapper注解之后这个接口在编译时会生成相应的实现类,让其他的类进行引用 @Mapper public interface EmpMapper { public Li ...
- win10 安装mysql5.7 【自定义安装路径】
- 解决servlet中get方式中中文乱码问题前驱(一):装饰者模式再理解
package day02; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; ...