hdu 4001 To Miss Our Children Time (DP)

来源:互联网 发布:菜鸟网络杭州总部 编辑:程序博客网 时间:2024/04/29 20:41

思路:转化为DAG上的动态规划,长方体的“可堆叠”关系是一个典型的二元关系,用图来建模。如果一个长方体X可以放在另外一个长方体Y的上面我们就从X到Y连一条边。这个有向图在缩点后是无环的。是一个DAG,求DAG上的最大高度即可。

F(i)代表当最上面一个长方体是第i个时能得到的最大高度。

代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN = 1000+5;long long N, a[MAXN], b[MAXN], c[MAXN], d[MAXN] , l , w , h , t;int tot;int map[MAXN][MAXN];long long f[MAXN];bool flag;long long F(int u){    if (f[u])        return f[u];    for (int i = 0; i < tot; i ++)        if(map[u][i] == 1) f[u] = max(f[u], F(i));    return f[u] = f[u] + c[u];}int main(){    while (scanf("%d" , &N) && N){        memset(map, -1, sizeof(map));        memset(f, 0, sizeof(f));        tot = 0;        for (int i = 0; i < N; i++){            scanf("%lld%lld%lld%lld", &l, &w, &h, &t);            flag = false;            if (l > w)                swap(l, w);            if(t == 0){                for(int j = 0 ; j < i ; j ++){                    if(d[j] == 0 && l == a[j] && w == b[j]){                        c[j] += h;                        flag = true;                        break;                    }                }            }            if(flag == false){                a[tot] = l;                b[tot] = w;                c[tot] = h;                d[tot] = t;                tot ++;            }        }        for (int i = 0; i < tot; i++)            for (int j = 0; j < tot; j++) if (i != j){                if (d[i] == 0){                    if (a[i] >= a[j] && b[i] >= b[j])                    {                        map[i][j] = 1;                    }                }                else if (d[i] == 1){                    if (a[i] >= a[j] && b[i] >= b[j] && a[i]*b[i] > a[j]*b[j])                        map[i][j] = 1;                }                else{                    if (a[i] > a[j] && b[i] > b[j])                        map[i][j] = 1;                }            }        long long ans = 0;        for (int u = 0; u < tot; u++)            ans = max(ans, F(u));        printf("%I64d\n", ans);    }    return 0;}/*10 10 12 010 10 11 010 10 12 0*//*1010 10 12 010 10 11 010 10 12 010 10 11 210 10 11 25 5 10 05 5 1 06 6 10 010 11 2 26 7 4 1*/

原创粉丝点击