uva_437_The Tower of Babylon
来源:互联网 发布:数据铁笼和司法改革 编辑:程序博客网 时间:2024/06/05 18:09
lis变形,这里的长度由原来的1变为hsolve: 1.每个三面体,应该有3!种可能性 2.对所有可能性进行排序,因为体积小的不可能在体积大的后面枚举 3.求lis
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAXN 256typedef struct _BLOCK { int l, w, h;}BLOCK;int dp[MAXN];BLOCK block[MAXN];int cmp(const BLOCK &a, const BLOCK &b){ if( a.l == b.l ) { return a.w < b.w; } return a.l < b.l;}int dynamic_programming(const int &n){ int rst(0); for(int i = 0; i < n; i ++) { dp[i] = block[i].h; } for(int i = 0; i < n; i ++) { for(int j = 0; j < i; j ++) { if( block[i].l > block[j].l && block[i].w > block[j].w && dp[i] < dp[j]+block[i].h ) { dp[i] = dp[j]+block[i].h; rst = max(rst, dp[i]); } } } return rst;}int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE freopen("test.in", "r", stdin);#endif int n, idx, x, y, cas(1); while( scanf("%d", &n) && n ) { idx = n; for(int i = 0; i < n; i ++) { scanf("%d %d %d", &block[i].l, &block[i].w, &block[i].h); } for(int i = 0; i < idx; i ++) { block[n].l = block[i].w; block[n].w = block[i].l; block[n ++].h = block[i].h; block[n].l = block[i].w; block[n].w = block[i].h; block[n ++].h = block[i].l; block[n].l = block[i].h; block[n].w = block[i].w; block[n ++].h = block[i].l; block[n].l = block[i].l; block[n].w = block[i].h; block[n ++].h = block[i].w; block[n].l = block[i].h; block[n].w = block[i].l; block[n ++].h = block[i].w; } sort(block, block+n, cmp); printf("Case %d: maximum height = %d\n", cas ++, dynamic_programming(n)); } return 0;}