您的位置:首页 > 其它

hdu 4001解题报告

2014-02-11 22:27 381 查看

-hdu- 4001 解题报告

题目大意:有n块大小、高度不一的矩形砖块,且类型为0,1,2三种,分别有不同叠放顺序。求最终能够得到的最大高度。

题目解析:dp动态规划的类型,但先要进行对砖块按长度、宽度和高度排序。接下去就是分三种情况进行dp,状态dp[i]表示的是第i块砖块放置的位置的高度。

状态转移方程是dp[i]=max(dp[i],dp[j]+block[i].height),意思就是尝试是否第i块砖块放在第j块上后dp值会变大。

实现代码:

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include<algorithm>

#include<vector>

#include<string>

using namespace std;

typedef long long int64;

struct node{

longlong a, b, c, d;

}; //分别是长度,宽度,高度和类型

node l[1005]; //存放矩形信息的数组

int64 dp[1005]; //动态数组,dp【i】表示第i块砖块位置的高度

int64 temp, ans; //ans 是最终的答案

int n;

bool cmp(node l, node r){ //多条件排序,长度从小到大,其次宽度从小到大,最次高度从大到小

if(l.a!= r.a) return l.a < r.a;

if(l.b!= r.b) return l.b < r.b;

returnl.d > r.d;

}

void dpfun(){ //dp函数主体

for(inti = 0; i < n; i ++ ) dp[i] = l[i].c; //各自放在最底层的时候

ans= l[0].c;

for(inti = 0; i < n; i ++ ){

if(l[i].d== 0){

for(intj = 0; j < i; j ++ ){

if(l[i].a>= l[j].a && l[i].b >= l[j].b && dp[j]+l[i].c > dp[i])

dp[i]= dp[j]+l[i].c; //如果满足if的条件,则第i块放在第j块的上面

}

}elseif( l[i].d == 1 ){

for(intj = 0; j < i; j ++ ){

if(l[i].a>= l[j].a && l[i].b >= l[j].b && (l[i].a*l[i].b >l[j].a*l[j].b) && dp[j]+l[i].c > dp[i])

dp[i]= dp[j]+l[i].c;

}

}elseif(l[i].d == 2 ){

for(intj = 0; j < i; j ++ ){

if(l[i].a> l[j].a && l[i].b > l[j].b && dp[j]+l[i].c > dp[i])

dp[i]= dp[j]+l[i].c;

}

}

if(ans< dp[i]) ans = dp[i]; //枚举得到整个dp过程中出现过的最大的高度值

}

}

int main(){

inti, j, a, b, c, d;

while(scanf("%d", &n) != EOF ){

if(n == 0 ) break;

for(i = 0; i < n; i ++ ){

scanf("%d%d%d%d",&l[i].a, &l[i].b, &l[i].c, &l[i].d);

if(l[i].a < l[i].b ){ //默认a是长度,大于等于宽度b

temp= l[i].a;

l[i].a= l[i].b;

l[i].b= temp;

}

}

sort(l,l+n, cmp);

dpfun();

printf("%I64d\n",ans);

}

return0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: