POJ3018-Giftbox
http://poj.org/problem?id=3018
DP版本
#include<cstdio> #include<cstring> #include<algorithm> #define INF 100000000; using namespace std; int box[510][1010],map[510][510],dp[510],n,d,count=0; bool ok; bool solve(int a,int b) { int i,j; bool flag=true; for(i=1;i<=d;i++) { if(box[a][i]>=box[b][i]) { flag=false; break; } } return flag; } void init() { int i,j; memset(map,0,sizeof(map)); for(i=2;i<=n;i++) { if(solve(1,i)) { map[1][i]=1; ok=true; } } for(i=2;i<=n;i++) for(j=2;j<=n;j++) if(solve(i,j)) map[i][j]=1; } int main(void) { int i,j,k,ans; while(scanf("%d%d",&n,&d)!=EOF) { n++; ok=false; for(i=1;i<=n;i++) { for(j=1;j<=d;j++) scanf("%d",&box[i][j]); sort(box[i]+1,box[i]+1+d); } init(); if(!ok) { printf("Please look for another gift shop!"); continue; } dp[1]=0; for(i=2;i<=n;i++) dp[i]=-1; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(map[i][j]&&dp[i]!=-1) if(dp[i]+1>dp[j]) dp[j]=dp[i]+1; ans=0; for(i=1;i<=n;i++) if(dp[i]>ans) ans=dp[i]; printf("%d\n",ans); } return 0; }
DFS版本
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int box[510][1010],map[510][510],n,d,ans,count=0; bool ok; bool solve(int a,int b) { int i,j; bool flag=true; for(i=1;i<=d;i++) if(box[a][i]>=box[b][i]) { flag=false; break; } return flag; } void init() { int i,j; memset(map,0,sizeof(map)); for(i=2;i<=n;i++) if(solve(1,i)) { map[1][i]=1; ok=true; } for(i=2;i<=n;i++) for(j=2;j<=n;j++) if(solve(i,j)) map[i][j]=1; } void dfs(int p,int max) { int i; if(max>ans) ans=max; for(i=2;i<=n;i++) if(map[p][i]) { max++; dfs(i,max); max--; } } int main(void) { int i,j,k; while(scanf("%d%d",&n,&d)!=EOF) { n++; ok=false; for(i=1;i<=n;i++) { for(j=1;j<=d;j++) scanf("%d",&box[i][j]); sort(box[i]+1,box[i]+1+d); } init(); if(!ok) { printf("Please look for another gift shop!"); continue; } ans=0; dfs(1,0); printf("%d\n",ans); } return 0; }