码迷,mamicode.com
首页 > 其他好文 > 详细

The Tower of Babylon UVA - 437

时间:2020-02-09 18:54:26      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:scan   The   color   under   line   ext   turn   its   can   

题面: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\n",ca++,height);
    }
    return 0;
}

The Tower of Babylon UVA - 437

标签:scan   The   color   under   line   ext   turn   its   can   

原文地址:https://www.cnblogs.com/baihualiaoluan/p/12287752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!