HURST 1116:选美大赛(LIS+路径输出)

选美大赛
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 1099(318 users) Total Accepted: 349(252 users) Rating:  Special Judge: No
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;
}
原文地址:https://www.cnblogs.com/Friends-A/p/10324404.html