3 2 1 1 4 1 2 3 4 5 1 1 2 2 2
1 3 2HintFor 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.
这题太坑了,把思路完全引到了求出LIS,然后判断LIS是否唯一上去了
其实不然, 比如 1 1 2,LIS == 2,但是光这样无法判断出来次大的长度是多少
网上题解是记录每个位置LIS的个数,如果到最后一位LIS只有一个就输出LIS-1,否则去判断LIS上每一个位置上LIS是否唯一,不唯一就输出LIS,否则输出LIS - 1
ac代码
#include<stdio.h>
#include<string.h>
#define INF 0xfffffff
int dp[1010],num[1010];
int a[1010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
dp[i]=1;
num[i]=1;
}
num[n+1]=1;
dp[n+1]=1;
a[n+1]=INF;
for(i=1;i<=n+1;i++)
{
for(j=1;j<i;j++)
{
if(a[i]>a[j]&&dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
num[i]=1;
}
else
{
if(a[i]>a[j]&&dp[i]==dp[j]+1)
{
num[i]++;
}
}
}
}
if(num[n+1]>1)
{
printf("%d\n",dp[n+1]-1);
continue;
}
int k=n+1;
while(k>0&&num[k]==1)
{
for(i=k-1;i>=1;i--)
{
if(dp[k]==dp[i]+1&&a[k]>a[i])
{
break;
}
}
k=i;
}
if(k==0)
{
printf("%d\n",dp[n+1]-2);
}
else
printf("%d\n",dp[n+1]-1);
}
}
HDOJ 题目5087 Revenge of LIS II(第二长LIS)
原文:http://blog.csdn.net/yu_ch_sh/article/details/45421281