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;
}
浙公网安备 33010602011771号