题目:

Given an unsorted array of integers, find the number of longest increasing subsequence.

Example 1:

Input: [1,3,5,4,7]
Output: 2
Explanation: The two longest increasing subsequence are [1, 3, 4, 7] and [1, 3, 5, 7].

Example 2:

Input: [2,2,2,2,2]
Output: 5
Explanation: The length of longest continuous increasing subsequence is 1, and there are 5 subsequences' length is 1, so output 5.

题解:

  首先解决最长的递增序列问题,最朴素的做法是深搜,以每一个数为开头,找位置在它后面的且数值比它大的为下一层,显然会超时,考虑用动态规划去解决问题(也就是最长上升序列(LIS),一个经典的动态规划问题)。其实就是LIS的变体。 摘自九章算法

1. 设dp[i]为以该数结尾,能构成的最长序列的长度。进行连接的时候,对于每个数字num[i],遍历位置在它之前的数字num[j],如果比这个数小(num[j]<num[i]),也就是能构成一个序列,这样就能进行状态转移,我们令dp[i]=max(dp[i],dp[j]+1)来保证存储的为最长长度,同时可以记录max(dp[i])

2. 考虑完题目的长度优先后,我们考虑数量,也就是说最长长度的序列有几个,这个问题需要我们在处理dp的时候来记录,我们设ans[i]为以第i个数结尾的最长序列的个数,与dp同理,ans初值也都是1

3. 状态转移的时候,如果dp更新了,也就是说(dp[j]+1>dp[i])说明这个长度的序列是新出现的,我们需要将ans[i]设置为ans[j],因为新序列中,最新的数提供了序列的尾巴,数量是由前面积累的(或者说转移);举例序列[1 1 3 7]我们易得数字3对应的dp=2,ans=2,因为可以构成两个[1 3]那么我们操作到数字7的时候,发现接在3后面最长,就可以转移ans来作为初始数量

4. 而当dp[j]+1==dp[i]的时候,如同样例,操作7的时候,我们最先发现了可以接在5后面,最长序列[1 3 5 7],然后发现可以接在4后面,[1 3 4 7],长度也是4,这时候就同样需要转移ans,加上去 ans[i]+=ans[j]

5. 最后我们需要遍历dp,找到dp[i]=我们记录的最大值的时候,累加我们得到的ans[i],即为所求结果,时间复杂度是O(n^2)

Solution

class Solution {
public:
int findNumberOfLIS(vector<int>& nums) {
int n = nums.size(), max_len = , res = ;
vector<int> dp(n, ), cnt(n, );
for(int i = ; i < n; ++i){
for(int j = ; j < i; ++j){
if(nums[j] < nums[i] && dp[j] + > dp[i]){
dp[i] = dp[j] + ;
cnt[i] = cnt[j];
} else if(nums[j] < nums[i] && dp[j] + == dp[i]){
cnt[i] += cnt[j];
}
}
max_len = max(max_len, dp[i]);
}
for(int i = ; i < n; ++i)
if(dp[i] == max_len) res += cnt[i];
return res;
}
};

【LeetCode】673. Number of Longest Increasing Subsequence的更多相关文章

  1. 【LeetCode】673. Number of Longest Increasing Subsequence 解题报告(Python)

    [LeetCode]673. Number of Longest Increasing Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https:/ ...

  2. 【LeetCode】873. Length of Longest Fibonacci Subsequence 解题报告(Python)

    [LeetCode]873. Length of Longest Fibonacci Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: ...

  3. Week 12 - 673.Number of Longest Increasing Subsequence

    Week 12 - 673.Number of Longest Increasing Subsequence Given an unsorted array of integers, find the ...

  4. [LeetCode] 673. Number of Longest Increasing Subsequence 最长递增序列的个数

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...

  5. LeetCode 673. Number of Longest Increasing Subsequence

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...

  6. 673. Number of Longest Increasing Subsequence

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...

  7. 673. Number of Longest Increasing Subsequence最长递增子序列的数量

    [抄题]: Given an unsorted array of integers, find the number of longest increasing subsequence. Exampl ...

  8. [LeetCode] Number of Longest Increasing Subsequence 最长递增序列的个数

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...

  9. LeetCode Number of Longest Increasing Subsequence

    原题链接在这里:https://leetcode.com/problems/number-of-longest-increasing-subsequence/description/ 题目: Give ...

随机推荐

  1. iOS copy 和 mutableCopy 学习

    (参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分 关于Copy  有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底 ...

  2. 【leetcode刷题笔记】Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  3. [Android]动态加载/热部署框架汇总

    1.DroidPlugin 用途:动态加载 使用案例:360手机助手 GitHub地址:https://github.com/Qihoo360/DroidPlugin ppt介绍:https://gi ...

  4. Maven配置一键部署远程Tomcat

    1. 首先需要配置远程Tomcat的访问权限(设置访问用户名密码) http://www.cnblogs.com/liuchao102/p/5519345.html 2. 配置pom.xml 添加to ...

  5. HIVE 2.1.0 安装教程。(数据源mysql)

    前期工作 安装JDK 安装Hadoop 安装MySQL 安装Hive 下载Hive安装包 可以从 Apache 其中一个镜像站点中下载最新稳定版的 Hive, apache-hive-2.1.0-bi ...

  6. uvalive 6938 区间dp

    看到n范围和给的区间看着就像区间dp 然后怎么cmp感觉都没法进行区间合并 n的300误导了下 没有注意离散化之后对时间可以dp 然而这个dp感觉不太经得起证明的样子... dp[i][j] -> ...

  7. Java -- DBUtils 框架 操作MySQL数据库

    1. 增删改查 常用Handler处理器示例 QueryRunner类提供了两个构造方法: •默认的构造方法 •需要一个 javax.sql.DataSource来作参数的构造方法.   public ...

  8. JAVA8新特性——接口定义增强

    JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 接口定义增强 在JDK1.8以前,接口是定义的: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法 ...

  9. 云服务器pip下载老失败怎么办?

    pip install -i https://pypi.douban.com/simple django==1.9

  10. 0.00-050613_head.s

    # head.s contains the -bit startup code. # Two L3 task multitasking. The code of tasks are in kernel ...