zoj 1093 Monkey and Banana 简单dP 入门
2011-07-13 22:39
477 查看
这是前几天的题,题目之前一直没时间上CSDN。
题目意思是 猴子要吃香蕉,给你几个箱子,问猴子能够达到的最大高度,箱子要下面的面积比上面的大,这样才能放稳。
动态规划,就是把后面做的建立在前面的基础上,实际上就是分治de策略,关键是子问题的发现与记录。
对于本题,就是求每一步,组成的高度,然后记录。
code:
#include <stdio.h>//一个箱子有3种h..所以总共有3*n种高度.按面积从大到小排序
#include <stdlib.h>
struct block
{
int x,y,z,h;
}a[200];
int cmp(const void *a,const void *b)//快排,模版
{
return ((struct block *)b)->x*((struct block *)b)->y - ((struct block *)a)->x*((struct block *)a)->y;
}
int main()
{
int b,c,d;
int n,max,maxmax,k=0;
int i,j;
while(scanf("%d",&n)!=EOF && n)
{
k++;
j=0;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&d,&b,&c);//用a,b,c防止后面把前面覆盖。
a[j].x=d;
a[j].y=b;
a[j].z=c;
j++;
a[j].x=d;
a[j].y=c;
a[j].z=b;
j++;
a[j].x=b;
a[j].y=d;
a[j].z=c;
j++;
a[j].x=b;
a[j].y=c;
a[j].z=d;
j++;
a[j].x=c;
a[j].y=b;
a[j].z=d;
j++;
a[j].x=c;
a[j].y=d;
a[j].z=b;
j++;
}
qsort(a,6*n,sizeof(a[0]),cmp);
for(i=0;i<n;i++)
a[i].h=a[i].z;
maxmax=a[0].h;
for(i=0;i<6*n;i++)
{
max=a[i].z;
for(j=0;j<i;j++)
{
if(a[i].x<a[j].x&&a[i].y<a[j].y)
{
if(a[i].z+a[j].h>max)//不重复加
max=a[i].z+a[j].h;
}
}
a[i].h=max;
if(a[i].h>maxmax)
maxmax=a[i].h;
}
printf("Case %d: maximum height = %d\n",k,maxmax);
}
return 0;
}
题目意思是 猴子要吃香蕉,给你几个箱子,问猴子能够达到的最大高度,箱子要下面的面积比上面的大,这样才能放稳。
动态规划,就是把后面做的建立在前面的基础上,实际上就是分治de策略,关键是子问题的发现与记录。
对于本题,就是求每一步,组成的高度,然后记录。
code:
#include <stdio.h>//一个箱子有3种h..所以总共有3*n种高度.按面积从大到小排序
#include <stdlib.h>
struct block
{
int x,y,z,h;
}a[200];
int cmp(const void *a,const void *b)//快排,模版
{
return ((struct block *)b)->x*((struct block *)b)->y - ((struct block *)a)->x*((struct block *)a)->y;
}
int main()
{
int b,c,d;
int n,max,maxmax,k=0;
int i,j;
while(scanf("%d",&n)!=EOF && n)
{
k++;
j=0;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&d,&b,&c);//用a,b,c防止后面把前面覆盖。
a[j].x=d;
a[j].y=b;
a[j].z=c;
j++;
a[j].x=d;
a[j].y=c;
a[j].z=b;
j++;
a[j].x=b;
a[j].y=d;
a[j].z=c;
j++;
a[j].x=b;
a[j].y=c;
a[j].z=d;
j++;
a[j].x=c;
a[j].y=b;
a[j].z=d;
j++;
a[j].x=c;
a[j].y=d;
a[j].z=b;
j++;
}
qsort(a,6*n,sizeof(a[0]),cmp);
for(i=0;i<n;i++)
a[i].h=a[i].z;
maxmax=a[0].h;
for(i=0;i<6*n;i++)
{
max=a[i].z;
for(j=0;j<i;j++)
{
if(a[i].x<a[j].x&&a[i].y<a[j].y)
{
if(a[i].z+a[j].h>max)//不重复加
max=a[i].z+a[j].h;
}
}
a[i].h=max;
if(a[i].h>maxmax)
maxmax=a[i].h;
}
printf("Case %d: maximum height = %d\n",k,maxmax);
}
return 0;
}
相关文章推荐
- zoj 3349 简单DP 线段树或树状数组优化
- zoj 3471 Most Powerful 状压dp(简单)
- ZOJ 1093 && NYoj16(DP)
- ZOJ 3623 Battle Ships 简单DP
- ZOJ 2402 Lenny's Lucky Lotto Lists(简单DP)
- zoj1163 The Staircases (简单dp)
- 树形dp入门[POJ1655][HDU1520][HDU1561][HDU1011][POJ1155][ZOJ3626]
- 斜率优化dp 的简单入门
- HDU 1520 Anniversary party (简单树形DP入门)
- 【HDU 1005 && ZOJ 3539】简单矩阵dp
- 斜率优化dp 的简单入门
- zoj1074 To the Max(简单的DP)
- ZOJ 2136 Longest Ordered Subsequence(简单DP)
- zoj1093 Monkey and Banana(DP)
- zoj 3640 Help Me Escape 期望DP 简单题 适合记忆化搜索
- ZOJ2402 Lenny's Lucky Lotto List 简单DP
- HDOJ2577 DP简单入门题
- ZOJ 3802 Easy 2048 Again(简单DP)
- 简单概率dp(期望)-zoj-3640-Help Me Escape
- zoj 3697 恶心模拟 +简单DP