UVA 437The Tower of Babylon (DAG)

1.题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19214

2.该图属于DAG模型,建图,然后对每个点跑一篇最长路取最大即可。对于多决策问题,且每一个的当前状态由前一个状态影响,我们可以用dp的思想。先求出状态方程,然后用DAG或者刷表发更新出来。

AC:

#include <algorithm>
#include <string>
#include <iostream>
#include <string.h>
#include<stdio.h>
#include<cmath>
#include<vector>
using namespace std;
#define ll  long long int
#define debug
const int maxn=1212;
struct ss
{
    int x,y,z;
}st[3*maxn];
int dp[3*maxn],mp[3*maxn][3*maxn],an;
int a,b,c,cnt=0;
int dag(int i)
{
    int &ans=dp[i];
    if(ans>0) return ans;
    ans=st[i].z;
    for(int j=0;j<cnt;j++)
    {
        if(mp[i][j]) ans=max(ans,dag(j)+st[i].z);
    }
    return ans;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    int kase=0;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        cnt=0;
        memset(dp,0,sizeof dp);
        memset(mp,0,sizeof mp);
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            st[cnt].x=max(a,b); st[cnt].y=min(a,b); st[cnt++].z=c;
            st[cnt].x=max(a,c); st[cnt].y=min(a,c); st[cnt++].z=b;
            st[cnt].x=max(c,b); st[cnt].y=min(c,b); st[cnt++].z=a;
        }
        for(int i=0;i<cnt;i++)
        {
            for(int j=0;j<cnt;j++)
            {
                if(st[i].x>st[j].x&&st[i].y>st[j].y) mp[i][j]=1;
            }
        }
        an=0;
        dag(0);
        for(int i=0;i<cnt;i++)
        {
         an=max(an,dag(i));
  }
        printf("Case %d: maximum height = %d\n",++kase,an);
    }
        return 0;
}

你可能感兴趣的:(UVA 437The Tower of Babylon (DAG))