HLG 1116选美大赛[最长递增子序列]

Description

一年一度的哈理工选美大赛开始了.来自各个院系的N个美女们都在一起排成一排,然后从左到右给他们标号(1-N),评委叫兽开始观摩,由于身高高低都不同, 叫兽想从中选出尽可能多的人使得他们的身高从左到右依次递增,你能帮助叫兽吗?

Input

输入数据第一行一个数据表示美女的个数N(0

接下来有N个数据表示1-N标号的美女的身高,身高范围都在0-180之内

当N=0时候输入结束

Output

按照样例输出,首先The number is N:N是选出最多美女个数,然后后面输出N个数,代表选出美女的标号,从左到右依次输出.

题目保证答案唯一

Sample Input

3

2 1 2

3

1 2 3

0

Sample Output

The number is 2: 2 3

The number is 3: 1 2 3

View Code
#include<stdio.h>
#include<string.h>
int dp[1000];
int v[1000];
int g;
int lis(int p[1000],int n)
{
memset(v,0,sizeof(v));
int i,ans,j;
for(i=1;i<=n;i++)
dp[i]=0;
dp[1]=1;
for(i=2;i<=n;i++)
{
ans=dp[i];
for(j=1;j<i;j++)
if(p[i]>p[j]&&dp[j]>ans)
{
ans=dp[j];
v[i]=j;
}
dp[i]=ans+1;
}
ans=0;
for(i=1;i<=n;i++)
if(dp[i]>ans)
{
ans=dp[i];
g=i;
}
return ans;
}
void dg(int g)
{
if(g!=0)
{
dg(v[g]);
printf(" %d",g);
}
}
int main()
{
int i,k;
int p[1000],n;
while(scanf("%d",&n),n)
{
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
k=lis(p,n);
printf("The number is %d:",k);
dg(g);
putchar('\n');
}
return 0;
}


posted @ 2012-03-14 14:55  'wind  阅读(289)  评论(0编辑  收藏  举报