leetcode-673. 最长递增子序列的个数
作者:互联网
/* dp[i]表示以i下标结尾的最长严格递增子序列的长度,需要注意的是最后算出来的dp[i]才是以i下标结尾的 最长严格递增子序列的长度,中间运行过程中dp[i]并不是以i结尾的最长严格递增子序列的长度, 而是以i结尾的递增子序列的长度。 cnt[i]为考虑以nums[i]结尾的最长上升子序列的个数 那么在nums[i] > nums[j]前提下, 有两种情况: (1)如果在[0, i-1]的范围内,找到了j,使得dp[j] + 1 > dp[i],说明找到了一个更长的递增子序列。 那么以j为结尾的子串的最长递增子序列的个数,就是最新的以i为结尾的子串的最长递增子序列的个数, 即:count[i] = count[j]。 (2)如果在[0, i-1]的范围内,找到了j,使得dp[j] + 1 == dp[i],说明找到了两个相同长度的递增子序列。 那么以i为结尾的子串的最长递增子序列的个数 就应该加上以j为结尾的子串的最长递增子序列的个数, 即:count[i] += count[j]; */ class Solution { public: int findNumberOfLIS(vector<int>& nums) { int n = nums.size(); if(n<=1) return n; vector<int> dp(n,1); vector<int> cnt(n,1); int maxval = -1; for(int i = 0; i < n; i++){ for(int j = 0; j < i; j++){ if(nums[i] > nums[j]){ if(dp[i] < dp[j]+1) cnt[i] = cnt[j]; else if(dp[i] == dp[j]+1) cnt[i] = cnt[i] + cnt[j]; dp[i] = max(dp[i], dp[j]+1); } maxval = max(maxval,dp[i]); } } int res = 0;; for(int i = 0; i<n; i++){ // 如果以i结尾的递增子序列长度等于最大值,将以i即为的递增子序列个数进行累加 if(dp[i]==maxval) res += cnt[i]; } cout<<"res:"<<res<<endl; return res; } };
标签:cnt,nums,int,递增,个数,673,序列,leetcode,dp 来源: https://www.cnblogs.com/ymec/p/15314311.html