uva 103 Stacking Boxes

题意:给你n个m维的盒子,问你能够最多嵌套多少个。

DAG上最长路。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int box[45][15],map[45],route[45],n,m;
bool vis[45];
int dp(int);
bool fun(int,int);
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(box,0,sizeof(box));
        memset(map,0,sizeof(map));
        memset(vis,0,sizeof(vis));
        memset(route,0,sizeof(route));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                scanf("%d",&box[i][j]);
            }
            sort(box[i],box[i]+m);
        }
        int imax=0,pos=-1;
        for(int i=0;i<n;i++)
        {
            int temp=dp(i);
            if(imax<temp)
            {
                imax=temp;
                pos=i;
            }
        }
        printf("%d\n%d",imax,pos+1);
        for(int i=1;i<imax;i++)
        {
            printf(" %d",route[pos]+1);
            pos=route[pos];
        }
        puts("");
    }
    return 0;
}
int dp(int pos)
{
    if(vis[pos]) return map[pos];
    else
    {
        for(int i=0;i<n;i++)
        {
            if(i==pos) continue;
            if(fun(pos,i))
            {
                int temp=dp(i);
                if(map[pos]<temp+1)
                {
                    map[pos]=temp+1;
                    route[pos]=i;
                }
            }
        }
        vis[pos]=1;
        map[pos]=max(map[pos],1);
        return map[pos];
    }
}
bool fun(int pos1,int pos2)
{
    for(int i=0;i<m;i++)
    {
        if(box[pos1][i]>=box[pos2][i]) return false;
    }
    return true;
}


你可能感兴趣的:(ini,fun)