437 - The Tower of Babylon
Time limit: 3.000 seconds
思路:
对于一个(x,y,z)砖头,它可以有3中姿势放置: (前两个为地面,后一个为高)
x, y, z
x, z, y
y, z, x
把每种姿势都记录下来,变成了有3*n种固定姿势的砖头。
然后建图,求dag上的最长路。
完整代码:
/*0.015s*/
#include<bits/stdc++.h>
using namespace std;
int a[100][3], dp[100], n;
int DAG(int x)
{
if (dp[x] != -1) return dp[x];
dp[x] = a[x][2];///高
for (int y = 0; y < n; ++y)
{
if (y == x) continue;
if (a[y][0] < a[x][0] && a[y][1] < a[x][1] && dp[x] < DAG(y) + a[x][2])
dp[x] = DAG(y) + a[x][2];
}
return dp[x];
}
int main()
{
int cas = 0, maxh, i;
while (scanf("%d", &n) , n)
{
n += n << 1;
memset(dp, -1, sizeof(dp));
for (i = 0; i < n; i += 3)
{
scanf("%d%d%d", &a[i][0], &a[i][1], &a[i][2]);
sort(a[i], a[i] + 3);
a[i + 1][0] = a[i][0], a[i + 1][1] = a[i][2], a[i + 1][2] = a[i][1];
a[i + 2][0] = a[i][1], a[i + 2][1] = a[i][2], a[i + 2][2] = a[i][0];
}
maxh = 0;
for (i = 0; i < n; ++i)
if (maxh < DAG(i)) maxh = dp[i];
printf("Case %d: maximum height = %d\n", ++cas, maxh);
}
return 0;
}