hdu 1069 简单动态规划
2013-03-20 11:49
381 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1069
/*
题目大意:给出n种类型的木块,求用这些木块可以堆起的最大高度,要求上边的木快的长和宽都要严格小于下边。
*/
/*
题目大意:给出n种类型的木块,求用这些木块可以堆起的最大高度,要求上边的木快的长和宽都要严格小于下边。
*/
#include<stdio.h> #include<stdlib.h> #define N 95 int f ; //f 记录加上第i个木块后的最大高度 struct X { int x,y,z; }block ; int cmp(const struct X* a,const struct X* b) { if((*a).x!=(*b).x) return (*a).x-(*b).x; else return (*a).y-(*b).y; } int main() { int T,n,a,b,c,i,j,temp,tallest; T=1; while(scanf("%d",&n),n){ for(i=0,j=0;j<n;j++){ //每种木块可以有三种放法 scanf("%d%d%d",&a,&b,&c); block[i].x=a; block[i].y=b; block[i].z=c; block[i+1].x=a; block[i+1].y=c; block[i+1].z=b; block[i+2].x=c; block[i+2].y=b; block[i+2].z=a; i+=3; } for(i=0;i<n*3;i++){ //找出每种木块的长和宽 if(block[i].x<block[i].y){ temp=block[i].x; block[i].x=block[i].y; block[i].y=temp; } } qsort(block,n*3,sizeof(block[0]),cmp); //先按木块的"长"升序排列,"长"相等时再按"宽"升序排列 for(i=0,tallest=0;i<3*n;i++){ //将f[i]初始化为第i个的高度,计算f[i]时,遍历0—>i,找出放上第i个木块时的最大高度。 f[i]=block[i].z; for(j=0;j<=i;j++){ if(block[i].x>block[j].x&&block[i].y>block[j].y){ f[i]=max(f[i],f[j]+block[i].z); } tallest=max(tallest,f[i]); } } printf("Case %d: maximum height = %d\n",T++,tallest); } return 0; }
相关文章推荐
- hdu1069 Monkey and Banana 一个简单的动态规划
- HDU 1158(简单的动态规划)
- hdu 2059 简单动态规划
- hdu 1176 简单动态规划
- HDU 2571 命运 【简单动态规划】
- HDU 2084 数塔 (C++) (简单的动态规划)
- HDU 1267(简单的动态规划)
- HDU 1003 Max Sum - 简单动态规划
- 动态规划:HDU1069-Monkey and Banana
- 动态规划训练15 [Monkey and Banana HDU - 1069 ]
- HDU 1520 浅谈简单树形动态规划
- HDU 1028 简单动态规划
- hdu 1466 计算直线的交点数 (简单的动态规划)
- HDU 5366 简单动态规划DP
- hdu1231最大连续子序列(简单的动态规划)
- HDU 2041 超级楼梯 简单DP动态规划 递归
- UVALive 6486 Skyscrapers 简单动态规划
- 100道动态规划——20 HDU 1257 最少拦截系统 LIS 啊!我为什么这个都没有想到!
- HDU 4628(动态规划-状压dp)
- 简单动态规划-LeetCode198