当前位置:   article > 正文

最长递增子序列个数c++_c++子序列个数

c++子序列个数

之前已经做过计算最长增长子序列的题,但计算个数的边界处理还是很麻烦orz

主要注意相等的情况要单独处理

  1. class Solution {
  2. public:
  3. int findNumberOfLIS(vector<int>& nums) {
  4. //l[i]保存以nums[i]为结尾的子序列长度,k[i]保存子序列个数
  5. int*l=new int[nums.size()],*k=new int[nums.size()];
  6. int lmax=1,kmax=1;
  7. l[0]=1;k[0]=1;
  8. for(int i=1;i<nums.size();i++){
  9. l[i]=0;k[i]=0;
  10. for(int j=i-1;j>=0;j--){
  11. //寻找nums[j]<nums[i]的最长子序列[j,i)
  12. if(nums[i]>nums[j]){
  13. if(l[i]==l[j]){
  14. //存在多个长度为l[j]的子序列,且每个子序列有k[j]种构造方式
  15. k[i]+=k[j];
  16. }
  17. //l[j]为当前最长子序列
  18. else if(l[i]<l[j]){
  19. l[i]=l[j];
  20. k[i]=k[j];
  21. }
  22. }
  23. else if(nums[i]==nums[j]){
  24. //以[j,i)间节点为结尾的序列长度小于以[0,j]为结尾的序列
  25. if(l[i]<l[j]-1){
  26. l[i]=l[j]-1;
  27. k[i]=k[j];
  28. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/521503
推荐阅读
相关标签
  

闽ICP备14008679号