poj 3018

dp升序

代码:

#include<iostream>
#include<fstream>

using namespace std;

int n,m;

struct e{
	int a[1001];
};

e map[501];

int gif[1001];

int cmp(const void *a,const void *b){
	return *(int*)a-*(int*)b;
}

int cmp1(const void *a,const void *b){
	e *s=(e*)a;
	e *t=(e*)b;
	int i=0;
	while(i<m)
	{
		if(s->a[i]!=t->a[i])
			return s->a[i]-t->a[i];
		i++;
	}
	return 0;
}
int dp[501];

int ok(int s){
	int i;
	for(i=0;i<m;i++)
		if(map[s].a[i]!=gif[i])
			return 0;
	return 1;
}

int ok1(int s,int t){
	int i;
	for(i=0;i<m;i++)
		if(map[t].a[i]<=map[s].a[i])
			return 0;
	return 1;
}


void read(){
//	ifstream cin("in.txt");
	int i,j,k;
	while(cin>>n>>m)
	{
		for(i=0;i<m;i++)
		{
			cin>>map[0].a[i];
			gif[i]=map[0].a[i];
		}
		qsort(map[0].a,m,sizeof(int),cmp);
		qsort(gif,m,sizeof(int),cmp);
		for(i=1;i<=n;i++)
		{
			for(j=0;j<m;j++)
				cin>>map[i].a[j];
			qsort(map[i].a,m,sizeof(int),cmp);
		}
		qsort(map,n+1,sizeof(e),cmp1);
		i=0;
		while(!ok(i)) i++;
		memset(dp,0,sizeof(dp));
		dp[i]=1;
		for(;i<=n;i++)
			for(j=i+1;j<=n;j++)
				if(dp[i]!=0&&ok1(i,j))
					dp[j]=max(dp[j],dp[i]+1);
	
		int res=0;
		for(i=0;i<=n;i++)
			res=max(res,dp[i]);
		if(res==1)
			cout<<"Please look for another gift shop!"<<endl;
		else
			cout<<res-1<<endl;
	}	
}

int main(){
	read();
	return 0;
}

posted on 2011-04-30 18:48  宇宙吾心  阅读(231)  评论(0)    收藏  举报

导航