DAG不固定起点的最长路径问题:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define LEN 2000
#define MAX(A,B) (A>B?A:B)
typedef struct Node {
int x, y, z;
}Node;
Node box[LEN];
int height[LEN][LEN];
int d[LEN];
int _index;
int cmp(Node a, Node b) {
if(a.y == b.y) {
return a.x < b.x;
}
return a.y < b.y;
}
int dp(int i) {
int j;
if(d[i] > 0) return d[i];
d[i] = box[i].z;
for(j = 0; j < i; j++) {
if(box[i].x > box[j].x && box[i].y > box[j].y) {
d[i] = MAX(d[i], dp(j)+box[i].z);
}
}
return d[i];
}
int main() {
int n;
int i, j, k, cse;
cse = 1;
while(scanf("%d", &n), n != 0) {
int a, b, c, _max;
_index = 0;
memset(height, 0, sizeof(height));
memset(d, 0, sizeof(d));
memset(box, 0, sizeof(box));
for(i = 0; i < n; i++) {
scanf("%d%d%d", &a, &b, &c);
box[_index].x = a;
box[_index].y = b;
box[_index++].z = c;
box[_index].x = a;
box[_index].y = c;
box[_index++].z = b;
box[_index].x = b;
box[_index].y = a;
box[_index++].z = c;
box[_index].x = b;
box[_index].y = c;
box[_index++].z = a;
box[_index].x = c;
box[_index].y = a;
box[_index++].z = b;
box[_index].x = c;
box[_index].y = b;
box[_index++].z = a;
}
sort(box, box+_index, cmp);
_max = 0;
for(i = 0; i < _index; i++) {
_max = MAX(dp(i), _max);
}
printf("Case %d: maximum height = %d\n", cse++, _max);
}
return 0;
}