选美大赛 | ||||||
|
||||||
Description | ||||||
一年一度的哈理工选美大赛开始了.来自各个院系的N个美女们都在一起排成一排,然后从左到右给他们标号(1-N),评委叫兽开始观摩,由于身高高低都不同, 叫兽想从中选出尽可能多的人使得他们的身高从左到右依次递增,你能帮助叫兽吗? |
||||||
Input | ||||||
输入数据第一行一个数据表示美女的个数N(0<N<100) 接下来有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 |
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=1e6+10;
using namespace std;
int a[maxn];
int dp[maxn];
int vis[maxn];
int DP[maxn];
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int n;
while(cin>>n&&n)
{
ms(dp);
ms(DP);
ms(vis);
for(int i=0;i<n;i++)
cin>>a[i];
int ans=INT_MIN;
int res;
for(int i=0;i<n;i++)
{
dp[i]=1;
for(int j=0;j<i;j++)
{
if(a[i]>a[j]&&dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
vis[i]=j;
}
}
if(dp[i]>ans)
{
ans=dp[i];
res=i;
}
}
int ress=res;
int i=0;
while(1)
{
DP[i++]=vis[ress];
ress=vis[ress];
if(dp[ress]==1)
break;
}
cout<<"The number is "<<ans<<":";
for(int j=i-1;j>=0;j--)
cout<<" "<<DP[j]+1;
cout<<" "<<res+1<<endl;
}
return 0;
}