赞
踩
之前已经做过计算最长增长子序列的题,但计算个数的边界处理还是很麻烦orz
主要注意相等的情况要单独处理
- class Solution {
- public:
- int findNumberOfLIS(vector<int>& nums) {
- //l[i]保存以nums[i]为结尾的子序列长度,k[i]保存子序列个数
- int*l=new int[nums.size()],*k=new int[nums.size()];
- int lmax=1,kmax=1;
- l[0]=1;k[0]=1;
- for(int i=1;i<nums.size();i++){
- l[i]=0;k[i]=0;
- for(int j=i-1;j>=0;j--){
- //寻找nums[j]<nums[i]的最长子序列[j,i)
- if(nums[i]>nums[j]){
- if(l[i]==l[j]){
- //存在多个长度为l[j]的子序列,且每个子序列有k[j]种构造方式
- k[i]+=k[j];
- }
- //l[j]为当前最长子序列
- else if(l[i]<l[j]){
- l[i]=l[j];
- k[i]=k[j];
- }
- }
- else if(nums[i]==nums[j]){
- //以[j,i)间节点为结尾的序列长度小于以[0,j]为结尾的序列
- if(l[i]<l[j]-1){
- l[i]=l[j]-1;
- k[i]=k[j];
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。