1. 程式人生 > >UVA437 (DAG)動態規劃

UVA437 (DAG)動態規劃

UVA437

紫書上的動態規劃的題目,二元環。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

using namespace std;
const int maxn=35;
const int inf =0x3f3f3f;
typedef long long  ll;

int n;
int block[maxn][3],d[maxn][3];

void getdim(int* v,int b,int dim)
{
    int idx=0;
    for(int i=0;i<3;i++)
    {
        if(i!=dim)
            v[idx++]=block[b][i];
    }
    return ;
}

int dp(int i,int j)
{
    int& ans=d[i][j];
    if(ans>0)
        return ans;
    int tmp1[2],tmp2[2];
    getdim(tmp1,i,j);
    for(int a=0;a<n;a++)
    {
        for(int b=0;b<3;b++)
        {
            getdim(tmp2,a,b);
            if(tmp1[0]<tmp2[0] && tmp1[1]<tmp2[1])
                ans=max(ans,dp(a,b));
        }
    }
    ans+=block[i][j];
    return ans;
}

int main()
{
    int kase=0;
    while(~scanf("%d",&n) && n)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<3;j++)
                scanf("%d",&block[i][j]);
            sort(block[i],block[i]+3);
        }
        int ans=0;
        memset(d,0,sizeof(d));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<3;j++)
                ans=max(ans,dp(i,j));
        }
        printf("Case %d: maximum height = %d\n",++kase,ans);
    }
    return 0;
}