您的位置:首页 > 其它

hdu 5087 Revenge of LIS II

2014-11-01 22:53 309 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5087

题意求第二长的上升序列。 在求最长上升序列的同时加上一个数组,来记录以i为结尾的有多少条序列。如果n+1为结尾有多条,就输出dp[n+1]-1;

否则在这个最长的序列上每一个节点是不是都是num[i]==1,如果是,就输出dp[n+1]-2;否则输出dp[n+1]-1;

#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 1005
#define LL int
using namespace std;

int t;
LL a[maxn];
int n;
int dp[maxn];
int num[maxn];

int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(dp,0,sizeof(dp));
memset(num,0,sizeof(num));
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
a[n+1]=1000000001;
for(int i=1; i<=n+1; i++)
{
dp[i]=1;
num[i]=1;
for(int j=1; j<i; j++)
{
if(a[j]<a[i]&&dp[i]<dp[j]+1)
{
num[i]=1;
dp[i]=dp[j]+1;
}
else if(a[j]<a[i]&&dp[i]==dp[j]+1)
{
num[i]++;
}
}
}
if(num[n+1]>1) printf("%d\n",dp[n+1]-1);
else
{
int pos=n+1,j;
while(pos>0&&num[pos]==1)
{
for(j=pos-1; j>=1; j--)
{
if(dp[j]+1==dp[pos]&&a[j]<a[pos]) break;
}
pos=j;
}
if(pos==0) printf("%d\n",dp[n+1]-2);
else printf("%d\n",dp[n+1]-1);
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: