博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4001 To Miss Our Children Time
阅读量:5052 次
发布时间:2019-06-12

本文共 1371 字,大约阅读时间需要 4 分钟。

题意:

小孩子玩积木堆房子的情景:
每组测试数据第一行给出n,代表接下来有n块砖;
接下来n行,每行给出砖的长,宽,高,属性(a,b,c,d);
属性d:d=0:该砖的长度和宽度(a,b)要比垫在他下面的砖的长,广大或者相等;就是长>=长,宽>=宽
d=1:改砖的宽度和长度要比下面的砖的长度大或者相等,同时,该砖的宽度值和面积值要比下面的砖的面积值大;即长>=长,宽>=宽,面积>面积。也就是长>=长&&宽>=宽&&(长>长||宽>宽)

d=2:该砖的长度和宽度(a,b)要比垫在他下面的砖的长,广大(严格大于);长>长,宽>宽。

分析:

先按长、宽 从小到大排序,再按d值从大到小排序;

想一下,D值越大,即对大小堆叠的要求越严格,所以,当长和宽一样时,D值越大的放前面,D值小的仍可往上堆叠,如此,可趋于最优

之后按不同的d值做一个简单的DP,注意,长和宽可交换

还有总高度的可能会超过int,所以用了__int64

ContractedBlock.gif
ExpandedBlockStart.gif
View Code
#include
#include
using namespace std; struct block {
int a,b,c,d; }bl[1001]; int n; __int64 dp[1001],ans; bool cmp(block e,block f) {
if(e.a!=f.a) return e.a
f.d; } int main() {
while(scanf("%d",&n)==1&&n) {
for(int i=1;i<=n;i++) {
scanf("%d %d %d %d",&bl[i].a,&bl[i].b,&bl[i].c,&bl[i].d); if(bl[i].a
=bl[j].a&&bl[i].b>=bl[j].b) dp[i]=max(dp[j]+bl[i].c,dp[i]); if(bl[i].d==1&&bl[i].a>=bl[j].a&&bl[i].b>=bl[j].b&&(bl[i].a>bl[j].a||bl[i].b>bl[j].b)) dp[i]=max(dp[j]+bl[i].c,dp[i]); if(bl[i].d==2&&bl[i].a>bl[j].a&&bl[i].b>bl[j].b) dp[i]=max(dp[j]+bl[i].c,dp[i]); } if(dp[i]>ans) ans=dp[i]; } printf("%I64d\n",ans); } return 0; }

 

 

转载于:https://www.cnblogs.com/nanke/archive/2011/09/05/2167839.html

你可能感兴趣的文章
flash与字符串:替换表情
查看>>
Docker常用命令
查看>>
windows7+docker添加php扩展
查看>>
[UE4]多播代理实例
查看>>
开奖计算---五星直选复式
查看>>
正则表达式
查看>>
HTML5 地理位置的获取 (精确)
查看>>
MongoDB - Cursors
查看>>
Servlet中Web.xml的配置详解
查看>>
PHP QR CODE 类库生成二维码
查看>>
SpringMVC(二七) 自定义视图
查看>>
git 版本控制
查看>>
浅谈叶小钗面试的几个问题
查看>>
进程间通信方式总结
查看>>
FCC 中级算法题 Finders Keepers
查看>>
Python之环境搭建与pycharm的配置django安装及MySQL数据库配置
查看>>
处理选中图片
查看>>
SpringBoot入门教程(十九)@ControllerAdvice+@ExceptionHandler全局捕获Controller异常
查看>>
iOS - 登陆、注销、修改密码
查看>>
给View添加阴影 和边框
查看>>