Revenge of LIS II

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1427    Accepted Submission(s): 489

Problem Description
In
computer science, the longest increasing subsequence problem is to find
a subsequence of a given sequence in which the subsequence's elements
are in sorted order, lowest to highest, and in which the subsequence is
as long as possible. This subsequence is not necessarily contiguous, or
unique.
---Wikipedia

Today, LIS takes revenge on you, again.
You mission is not calculating the length of longest increasing
subsequence, but the length of the second longest increasing
subsequence.
Two subsequence is different if and only they have
different length, or have at least one different element index in the
same place. And second longest increasing subsequence of sequence S
indicates the second largest one while sorting all the increasing
subsequences of S by its length.

 
Input
The first line contains a single integer T, indicating the number of test cases.

Each
test case begins with an integer N, indicating the length of the
sequence. Then N integer Ai follows, indicating the sequence.

[Technical Specification]
1. 1 <= T <= 100
2. 2 <= N <= 1000
3. 1 <= Ai <= 1 000 000 000

 
Output
For each test case, output the length of the second longest increasing subsequence.
 
Sample Input
3
2
1 1
4
1 2 3 4
5
1 1 2 2 2
 
Sample Output
1
3
2

Hint

For the first sequence, there are two increasing subsequence: [1], [1]. So the length of the second longest increasing subsequence is also 1, same with the length of LIS.

 
Source
 
题意:求解一个串中次长上升子序列的的长度。
题解:主要是求出有多少个最长上升子序列,如果个数大于1,那么次长就是最长,如果为1 ,那么次长就为最长的减一。关键是怎么统计最长上升子序列的个数??这里用到一个数组记录dp[i]的个数,当dp[j]+1>dp[i]时,dp[i]的个数为num[j],如果dp[j]+1==dp[i],那么 num[i] = num[i]+num[j]
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = ;
int dp[N],num[N];
int a[N];
int main(){
int tcase;
scanf("%d",&tcase);
while(tcase--){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
int ans = dp[] = num[]= ;
for(int i=;i<=n;i++){
dp[i] =num[i]= ;
for(int j=;j<i;j++){
if(a[i]>a[j]){
if(dp[i]==dp[j]+){
num[i]+=num[j];
}
if(dp[i]<dp[j]+){
dp[i] = dp[j]+;
num[i] = num[j];
}
}
}
ans = max(ans,dp[i]);
}
int cnt=;
for(int i=;i<=n;i++){
if(dp[i]==ans){
cnt+=num[i];
}
}
if(cnt==) printf("%d\n",ans-);
else printf("%d\n",ans);
}
return ;
}

最新文章

  1. 【转】Hadoop FS Shell命令
  2. ionic配置 问题小记
  3. Hadoop集群datanode磁盘不均衡的解决方案
  4. C++设计模式-Mediator中介者模式
  5. linux命令行下载jdk
  6. BZOJ1030——文本生成器
  7. 基于ubuntu-2.6.35内核的SDIO-WiFi驱动移植
  8. 观察器observes与对象初始化
  9. c++11之智能指针
  10. STL set_difference set_intersection set_union 操作
  11. C++设计模式-Iterator迭代器模式
  12. 689C - Mike and Chocolate Thieves 二分
  13. Logback日志基础配置以及自定义配置
  14. VS2017 性能优化方法
  15. Anaconda与Spyder升级命令
  16. Linux运行模式
  17. Android_编程开发规范
  18. 解决vmware与主机无法连通的问题
  19. Java知多少(91)对话框
  20. 176条DevOps人员常用的linux命令速查表

热门文章

  1. 关于Android SDK无法更新的解决办法
  2. 获取&lt;考试&gt;博文密码!o(*≧▽≦)ツ
  3. Hadoop学习笔记系列
  4. Spark Streaming实例
  5. IOS客户端的个人中心可以查看自己的博客了。
  6. 剑指Offer - 九度1351 - 数组中只出现一次的数字
  7. 更改maven本地仓库地址
  8. Java面试准备十六:数据库——MySQL性能优化
  9. iptables的配置文件/etc/sysconfig/iptables不存在 linux防火墙开关命令
  10. 转换 nvarchar 值 &#39;2013071200000578&#39; 时溢出了整数列