zoukankan      html  css  js  c++  java
  • LeetCode 673. Number of Longest Increasing Subsequence

    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.
    

    Note: Length of the given array will be not exceed 2000 and the answer is guaranteed to be fit in 32-bit signed int.

    分析

    这题和求最长不降子列类似,dp[i]记录以nums[i]结尾的最长子列长度,只需要另一个数组cnt,cnt[i]记录dp[i]对应的有几种,longest记录全程中最长子列长度,最后遍历dp数组,当dp[i]==longest时,count+=cnt[i].

    class Solution {
    public:
        int findNumberOfLIS(vector<int>& nums) {
            if(nums.size()==0) return 0;
            int count=0,longest=1;
            vector<int> dp(nums.size(),1),cnt(nums.size(),1);
            for(int i=1;i<nums.size();i++){
                for(int j=i-1;j>=0;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];
                    }
                }
                longest=max(longest,dp[i]);
            }
            for(int i=0;i<nums.size();i++)
                if(dp[i]==longest) count+=cnt[i];
            return count;
        }
    };
    
  • 相关阅读:
    开学第二周java作业暨动手动脑p1
    开学第一周
    暑假第九周
    暑假第八周
    bzoj4033:[HAOI2015]树上染色
    bzoj4472:[Jsoi2015]salesman
    dp专题复习
    bzoj1864:[Zjoi2006]三色二叉树
    bzoj1190:[HNOI2007]梦幻岛宝珠
    bzoj2794:[Poi2012]Cloakroom
  • 原文地址:https://www.cnblogs.com/A-Little-Nut/p/10080031.html
Copyright © 2011-2022 走看看