题目大意:
有n种长宽高为x,y,z的砖头,每种都有无数个。
砖头可以用不同姿势的方向来盖。
砖头a以某种姿势可以盖在砖头b上,当且仅当a的底部的长宽都要比b的底部长宽要小。
问最高可以建多高?
思路:
经典的DAG上的dp,把图建好后,d[i]:表示以i为起点的最大高度(可以画一个DAG图理解一下)
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<cstdio>
#include<cstring>
#define ll long long
#define pq priority_queue
using namespace std;
const int maxn = 100;
int d[maxn];
int G[maxn][maxn];
int n;
bool vis[maxn];
struct node
{
int x, y, z;
}a[maxn];
int dp(int u)
{
if(vis[u])
return d[u];
vis[u] = 1;
int ans = d[u];
for(int i = 1; i <= n; i++)
{
if(G[u][i])
d[u] = max(d[u], ans+dp(i));
}
return d[u];
}
int main()
{
int cas = 1;
while(scanf("%d", &n)!=EOF)
{
if(n==0)
break;
for(int i = 1; i <= n; i++)
{
scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z);
d[i] = a[i].z;
a[n+i].x = a[i].x;
a[n+i].y = a[i].z;
a[n+i].z = a[i].y;
d[n+i] = a[n+i].z;
a[2*n+i].y = a[i].z;
a[2*n+i].x = a[i].y;
a[2*n+i].z = a[i].x;
d[2*n+i] = a[2*n+i].z;
}
n *= 3;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if((a[i].x < a[j].x && a[i].y < a[j].y)||(a[i].x < a[j].y && a[i].y < a[j].x))
G[i][j] = 1;
}
}
int maxx = 0;
for(int i = 1; i <= n; i++)
{
maxx = max(maxx, dp(i));
}
printf("Case %d: maximum height = %d\n", cas++, maxx);
memset(vis, false, sizeof(vis));
memset(d, 0 ,sizeof(d));
memset(G, 0, sizeof(G));
}
return 0;
}