UVa:437 The Tower of Babylon

感觉UVA上的入门经典DP这块不是LCS就是LIS。

这个题是LIS,1Y。

 

没有想太多,对于每次输入的x,y,z,我都构造了3!=6种的形态。

分别依照x,y,z降序排序,然后再进行LIS动规。

 

 

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct Block
{
    int x,y,z;
};
bool cmp(Block a,Block b)
{
    if(a.x==b.x)
    {
        if(a.y==b.y) return a.z<b.z;
        else return a.y<b.y;
    }
    return a.x<b.x;
}
Block p[200];
int dp[200];
int main()
{
    int n,kase=0;
    while(scanf("%d",&n)&&n)
    {
        int x,y,z;
        int N=0;
        memset(dp,0,sizeof(dp));
        for(int i=0; i<n; ++i)
        {
            scanf("%d%d%d",&x,&y,&z);
            p[N].x=x;p[N].y=y;p[N].z=z;N++;
            p[N].x=x;p[N].y=z;p[N].z=y;N++;
            p[N].x=y;p[N].y=z;p[N].z=x;N++;
            p[N].x=y;p[N].y=x;p[N].z=z;N++;
            p[N].x=z;p[N].y=x;p[N].z=y;N++;
            p[N].x=z;p[N].y=y;p[N].z=x;N++;
        }
        sort(p,p+N,cmp);
        int ans=0;
        for(int i=N-1; i>=0; --i)
        {
            int mx=0;
            for(int j=i+1; j<N; ++j)
                if(p[i].x<p[j].x&&p[i].y<p[j].y&&dp[j]>mx)
                    mx=dp[j];
            dp[i]=mx+p[i].z;
            ans=max(ans,dp[i]);
        }
        printf("Case %d: maximum height = %d\n",++kase,ans);
    }
    return 0;
}

你可能感兴趣的:(动态规划,LIS)