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;
}
posted @ 2012-08-29 12:11  Yogurt Shen  阅读(173)  评论(0编辑  收藏  举报