UVA - 103 Stacking Boxes

来源:互联网 发布:sql删除数据库表数据 编辑:程序博客网 时间:2024/05/15 09:09

基础题,dag上的动态规划

盒子的各个长度可以随意排列

#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAX 40
using namespace std;


int k,n,box[MAX][15],dp[MAX],map[MAX][MAX],flag;


int d(int index)
{
    int i,j;
    if(dp[index]>0)
        return dp[index];
    for(i=0;i<k;i++)
    {
        if(map[index][i])
            dp[index]=max(dp[index],d(i)+1);
    }
    if(dp[index]==0)
        dp[index]=1;
    return dp[index];
}


void print(int index)
{
        if(flag!=0)
        printf(" ");
        flag++;
    printf("%d",index+1);
    int i;
    for(i=0;i<k;i++)
    if(map[index][i]&&dp[i]+1==dp[index])
    {
        print(i);
        break;
    }
}


int main()
{
    int i,j,t,maxx;
    while(scanf("%d %d",&k,&n)!=EOF)
    {
        for(i=0;i<k;i++)
            for(j=0;j<n;j++)
                scanf("%d",&box[i][j]);
        for(i=0;i<k;i++)
            sort(box[i],box[i]+n);
        memset(map,0,MAX*MAX*4);
        memset(dp,0,MAX*4);
        maxx=flag=0;
        for(i=0;i<k;i++)
        {
            for(j=0;j<k;j++)
            {
                for(t=0;t<n;t++)
                    if(box[j][t]<=box[i][t])
                    break;
                if(t==n)
                    map[i][j]=1;
            }
        }
        for(i=0;i<k;i++)
        {
            dp[i]=d(i);
        }
        for(i=0;i<k;i++)
            if(dp[i]>dp[maxx])
                maxx=i;
        printf("%d\n",dp[maxx]);
        print(maxx);
        puts("");
    }
    return 0;
}

0 0