【HDU4001】To Miss Our Children Time(LIS变形)

http://acm.hdu.edu.cn/showproblem.php?pid=4001

三种木板 每一种木板对放在其下面木板的长宽以及面积有不同的限制 求最大可以堆积的高度

简单的LIS变形 对每个值的比较改成相应种类木板的长宽面积比较就好了 

感觉作为2011年大连网络赛的第一题还是很友善的 就是最长不下降子序列 没发现其他坑的地方。。。。

为什么2011年的网络赛做起来比2015年的顺利多了 表示不服。。。。。

#include 
#include 
#include 
using namespace std;

const int maxn = 1010;
struct Block{
    int a, b, c, d;
}block[maxn];
long long dp[maxn];

bool cmp(Block aa, Block bb);

int main(){
    int n;
    while(scanf("%d", &n)!=EOF && n){
        for(int i = 0; i < n; ++i){
            scanf("%d%d%d%d", &block[i].a, &block[i].b, &block[i].c, &block[i].d);
            if(block[i].a < block[i].b){
                swap(block[i].a, block[i].b);
            }
        }
        sort(block, block+n, cmp);

        for(int i = 0; i < n; ++i){
            dp[i] = block[i].c;
            for(int j = 0; j < i; ++j){
                if(block[i].d == 0){
                    if(block[i].a >= block[j].a && block[i].b >= block[j].b){
                        dp[i] = max(dp[j]+block[i].c, dp[i]);
                    }
                }
                else if(block[i].d == 1){
                    if(block[i].a>=block[j].a && block[i].b>=block[j].b && (block[i].a>block[j].a||block[i].b>block[j].b)){
                        dp[i] = max(dp[j]+block[i].c, dp[i]);
                    }
                }
                else{
                    if(block[i].a > block[j].a && block[i].b > block[j].b){
                        dp[i] = max(dp[j]+block[i].c, dp[i]);
                    }
                }
            }
        }

        long long ans = 0;
        for(int i = 0; i < n; ++i){
            ans = max(ans, dp[i]);
        }

        cout << ans << endl;
    }
    return 0;
}

bool cmp(Block aa, Block bb){
    if(aa.a == bb.a){
        if(aa.b == bb.b){
            return aa.d > bb.d;
        }
        return aa.b < bb.b;
    }
    return aa.a < bb.a;
}


你可能感兴趣的:(dp,HDU)