紫书动规 例题9-2 UVA

来源:互联网 发布:金道交易软件 编辑:程序博客网 时间:2024/05/07 21:24

题目链接:

https://vjudge.net/problem/UVA-437

题意:

题解:

dp[i][j]:=考虑到前i个立方体并且第i个立方体以标号为j为高的最大值

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;#define MS(a) memset(a,0,sizeof(a))#define MP make_pair#define PB push_backconst int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}//////////////////////////////////////////////////////////////////////////const int maxn = 1e5+10;int n;int block[40][3],d[40][3];void get(int* v,int b,int x){    int idx = 0;    for(int i=0; i<3; i++)        if(i!=x)            v[idx++] = block[b][i];}int dp(int i,int j){    if(d[i][j] >= 0) return d[i][j];    d[i][j] = 0;    int v[2],v2[2];    get(v,i,j);    for(int a=0; a<n; a++){        for(int b=0; b<3; b++){            get(v2,a,b);            if(v[0]>v2[0] && v[1]>v2[1])                d[i][j] = max(d[i][j],dp(a,b));        }    }    d[i][j] += block[i][j];    return d[i][j];}int main(){    int cas = 0;    while(scanf("%d",&n) && n){        for(int i=0; i<n; i++){            scanf("%d%d%d",&block[i][0],&block[i][1],&block[i][2]);            sort(block[i],block[i]+3);        }        int ans = -INF;        memset(d,-1,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",++cas,ans);    }    return 0;}
0 0