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;
}
相关文章推荐
- hdu 2066 一个人的旅行 最短路 dijkstra 解题报告
- (解题报告)HDU2153———仙人球的残影
- hdu 1005解题报告
- HDU 2289 CUP 解题报告
- hdu 1010 解题报告 ----Tempter of the Bone
- HDU 4291解题报告
- 2018.2.4【 HDU - 5999 】解题报告(贪心)
- HDU 1846解题报告
- HDU 4726 Kia's Calculation 解题报告
- HDU 1848解题报告
- acm-hdu1874解题报告
- HDU 4671 Backup Plan 解题报告
- HDU 4614 Vases and Flowers 解题报告
- 解题报告:HDU_6169 Senior PanⅡ (记忆化搜索)
- HDU 4616 Game 解题报告
- HDU解题报告——1018
- hdu 2819 Swap 二分图匹配 匈牙利算法 解题报告
- HDU_1533 Going Home(最优匹配) 解题报告
- hdu_4374 One hundred layer解题报告
- 【解题报告】 HDU 4390 Number Sequence -- 容斥原理(不好理解)