leetcode:673. 最长递增子序列的个数(dp)

题目:

在这里插入图片描述

分析:

按照基础方法来做吧。
经典问题的改进:注意要统计最长出现的个数
A【i】表示i位置的最大值。

代码:

vector<int> n;
 int A[n.size()];
 A[0]=1;
 for(int i=1;i<n.size();i++)
 {
  A[i]=1;
  for(int j=0;j<i;j++) 
  {
   if(n[i]>n[j]) A[i]=max(A[i],A[j]+1);
  }
 }
 //找最大值
 int maxx=1;
 for(int i=0;i<n.size();i++)
 {
  maxx=max(A[i],maxx);
  } 

如何统计:

统计达到最大值的个数?不对。
在这里插入图片描述
应该再借助一个数组。在比较时就进行数据的统计。

代码:

int A[n.size()];
 int B[n.size()];
 A[0]=1;
 for(int i=0;i<n.size();i++) B[i]=1;
 for(int i=1;i<n.size();i++)
 {
  A[i]=1;
  for(int j=0;j<i;j++) 
  {
   if(n[i]>n[j]) A[i]=max(A[i],A[j]+1);
  }
  //A[i]的值已经确定,进行B【i】值的确定。
  if(A[i]==1) continue; 
  B[i]=0;
  for(int j=0;j<i;j++) 
  {
   if(A[i]-1==A[j]&&n[i]>n[j]) B[i]++;
  }
 }
 //找最大值
 int maxx=1;
 for(int i=0;i<n.size();i++)
 {
  maxx=max(A[i],maxx);
  } 
 //统计个数 
 int c=0;
 for(int i=0;i<n.size();i++)
 {
  if(maxx==A[i]) c=c+B[i];
  } 
 for(int i=0;i<n.size();i++)
 {
  cout<<A[i]<<"  "<<B[i]<<endl;
  }  
 return c;

因为B记录的是到达最值的个数。也只需要用每个位置到达最大值的个数。

其他思路:

自己又想到这样处理A数组。倒着找maxx-1,记录第一个出现的位置end,每次找到更新该处的值,很棒的思路哦,完全可行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值