DP LIS 记录路径 hdu 1160

按照:

W[m[1]] < W[m[2]] < ... < W[m[n]] 

S[m[1]] > S[m[2]] > ... > S[m[n]]  

排序

可以先排一半...

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAX 1003
struct node {
	int w,s,num;
}x[MAX];
int out[MAX],dp[MAX],index[MAX];
bool cmp(node a,node b){
	return a.w<b.w;
}
int main()
{
	int t,n=1,i,j,k;
	memset(index,0,sizeof(index));
	memset(dp,0,sizeof(dp));
	while(scanf("%d%d",&x[n].w,&x[n].s)!=EOF){
		x[n].num=n;
		dp[n]=1;
		n++;
	}
	sort(x,x+n,cmp);
	for(i=1;i<=n;i++){
		for(j=1;j<i;j++){
			if(x[i].w>x[j].w&&x[i].s<x[j].s&&dp[j]+1>dp[i]){
				dp[i]=dp[j]+1;
				index[x[i].num]=x[j].num; 
			}
		}
	}
	int ans=0;
	for(i=1;i<=n;i++){
		if(dp[i]>ans){
			ans=dp[i];
			k=x[i].num;//记录路径
		}
	}
	printf("%d\n",ans);
	for(i=ans;i>=1;i--){
		out[i]=k;
		k=index[k];
	}
	for(i=1;i<=ans;i++)
		printf("%d\n",out[i]);
	return 0;
}


posted @ 2014-05-04 23:57  kewowlo  阅读(212)  评论(0编辑  收藏  举报