Uva - 103 - Stacking Boxes

题意:有k个n维的东东,对于其中的两个,如果其中的一个东东的每一维都大于另一个东东的其中一维,那么就说可以嵌套它,求这k个东东互相嵌套的最长路径。

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=114&problem=39

——>>一个东东能嵌套另一个东东,则其n维元素排序后一定是每一维的元素都比另一个东东n维排序后的每一维元素都要大。

排序,建好图,记忆化搜索一次。

 

#include <cstdio>

#include <cstring>

#include <algorithm>



using namespace std;



struct Box

{

    int demension;

    int e[20];

    bool operator < (const Box& b) const

    {

        for(int i = 1; i <= demension; i++)

            if(e[i] >= b.e[i])

                return 0;

        return 1;

    }

    void boxSort()

    {

        sort(e+1, e+1+demension);

    }

};

int f[40], k;

int G[40][40];

Box box[40];

int dp(int i)

{

    int& ans = f[i];

    if(ans > 0) return ans;

    ans = 1;

    for(int j = 1; j <= k; j++)

        if(G[i][j]==1)

            ans = max(ans, dp(j)+1);

    return ans;

}

void print(int i)

{

    for(int j = 1; j <= k; j++)

        if(G[i][j] && f[i] == f[j]+1)

        {

            printf(" %d", j);

            print(j);

            break;

        }

}

int main()

{

    int n, i, j;

    while(~scanf("%d%d", &k, &n))

    {

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

        {

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

            {

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

                box[i].demension = n;

            }

            box[i].boxSort();

        }

        memset(G, 0, sizeof(G));

        for(i = 1; i <= k; i++)     //建图

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

                if(box[i] < box[j]) G[i][j] = 1;

        memset(f, 0, sizeof(f));



        for(i = 1; i <= k; i++) dp(i);      //dp求解



        int id = 1;

        for(i = 2; i <= k; i++)     //找最长路

            if(f[i] > f[id])

                id = i;

        printf("%d\n", f[id]);

        printf("%d", id);

        print(id);

        printf("\n");

    }

    return 0;

}




 

 

你可能感兴趣的:(stack)