您的位置:首页 > 其它

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

2016-01-04 21:20 351 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4001

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

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

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

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

#include <cstdio>
#include <algorithm>
#include <iostream>
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: