The Tower of Babylon UVA - 437

Posted baihualiaoluan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The Tower of Babylon UVA - 437相关的知识,希望对你有一定的参考价值。

题面:https://vjudge.net/problem/UVA-437

思路:

一道典型的DAG上进行记忆化搜索的题。

本题的数据范围非常小,可以把每个立方体当作三个高不同的立方体。假若第i个立方体能放在第j个立方体上,就在i-j之间连上一条边。最后枚举起点进行记忆化搜索即可。

代码:

#include <bits/stdc++.h>
using namespace std;
struct Cube
{
    int a,b,c;
    Cube(int _a = 0,int _b =0,int _c= 0):a(_a),b(_b),c(_c){};
};
Cube cu[100];
int d[100];
int G[100][100];
void have_edge(int a,int b)
{
    if((cu[a].a>cu[b].a&&cu[a].b>cu[b].b)||(cu[a].b>cu[b].a&&cu[a].a>cu[b].b))
        G[a][b] = 1;
}int n;
int dp(int i)
{
    int &ans = d[i];
    if(ans>0) return ans;
    ans = cu[i].c;
    for(int j = 0;j<3*n;++j)
    {
        if(G[i][j])
            ans = max(ans,cu[i].c+dp(j));
    }
    return ans;
}
int main()
{

    int ca = 1;
    while(scanf("%d",&n)&&n)
    {
        int a,b,c;
        int height = 0;
        memset(d,0,sizeof(d));
        memset(G,0,sizeof(G));
        for(int i = 0;i<n;++i)
        {
            scanf("%d %d %d",&a,&b,&c);
            cu[3*i] = Cube(a,b,c);
            cu[3*i+1]  =Cube(a,c,b);
            cu[3*i+2] = Cube(b,c,a);
        }
        for(int i = 0;i<3*n;++i)
        {
            for(int j = 0;j<3*n;++j)
                have_edge(i,j);
        }
        for(int i = 0;i<3*n;++i)
            d[i] = dp(i);
        for(int i = 0;i<3*n;++i)
            height = max(height,d[i]);
        printf("Case %d: maximum height = %d
",ca++,height);
    }
    return 0;
}

以上是关于The Tower of Babylon UVA - 437的主要内容,如果未能解决你的问题,请参考以下文章

Uva437 The Tower of Babylon

UVA437-The Tower of Babylon(动态规划基础)

uva 437 The Tower of Babylon

UVA437 The Tower of Babylon

The Tower of Babylon UVA - 437

uva437-The Tower of Babylon