zoukankan      html  css  js  c++  java
  • The Tower of Babylon UVA

    题面: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;
    }
  • 相关阅读:
    更换glibc版本进行调试
    HDCTF 2020 Writeup
    Srop 原理与利用方法
    form使用DELETE被转换为GET的原因
    sqlite将时间转换为本地时间读取
    firewall-cmd命令
    windows创建系统服务命令
    Open_vSwitch操作
    Dublin Core
    CWM(Common warehouse metamodel)
  • 原文地址:https://www.cnblogs.com/baihualiaoluan/p/12287752.html
Copyright © 2011-2022 走看看