UVA 103 Stacking Boxes --LIS

实际上是一个扩展维度的矩形嵌套问题。

一个物体能嵌入另一个物体中,当且仅当这个物体的所有维度的长度都小于另外一个(本题是小于等于),又因为可以旋转等变换,所以干脆将每个箱子的边从小到大排序,以便于判断是否能够嵌套。然后将箱子按第一维度从小到大排序,然后就是求一个“严格上升子序列”了。

代码:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <algorithm>

using namespace std;

#define N 47



struct Box

{

    int w[12];

    int ind;

}box[34];

int dp[N],little[N],ans[N];



int cmp(Box ka,Box kb)

{

    return ka.w[1] < kb.w[1];

}



void print_path(int tag)

{

    int k = 1,i;

    while(1)

    {

        ans[k++] = box[tag].ind;

        if(little[tag] == -1)

            break;

        tag = little[tag];

    }

    for(i=k-1;i>=2;i--)

        printf("%d ",ans[i]+1);

    printf("%d\n",ans[i]+1);

}



int main()

{

    int n,m,i,j,k;

    while(scanf("%d%d",&n,&m)!=EOF)

    {

        for(i=0;i<n;i++)

        {

            box[i].ind = i;

            for(j=1;j<=m;j++)

            {

                scanf("%d",&box[i].w[j]);

            }

            sort(box[i].w+1,box[i].w+m+1);

        }

        sort(box,box+n,cmp);

        for(i=0;i<n;i++)

            dp[i] = 1,little[i] = -1;

        for(i=1;i<n;i++)

        {

            for(j=0;j<i;j++)

            {

                int flag = 1;

                for(k=1;k<=m;k++)

                {

                    if(box[i].w[k] <= box[j].w[k])

                    {

                        flag = 0;

                        break;

                    }

                }

                if(flag)

                {

                    if(dp[i] < dp[j]+1)

                    {

                        dp[i] = dp[j]+1;

                        little[i] = j;

                    }

                }

            }

        }

        int maxi = -1,tag;

        for(i=0;i<n;i++)

        {

            if(dp[i] >= maxi)

            {

                maxi = dp[i];

                tag = i;

            }

        }

        printf("%d\n",maxi);

        print_path(tag);

    }

    return 0;

}
View Code

 

你可能感兴趣的:(stack)