zoj 1093 Monkey and Banana 简单dP 入门

本文通过动态规划解决猴子堆箱问题,实现箱子堆叠的最大高度。利用C语言编写程序,通过快速排序对箱子进行面积排序,并采用动态规划策略确定最大高度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是前几天的题,题目之前一直没时间上优快云。

题目意思是 猴子要吃香蕉,给你几个箱子,问猴子能够达到的最大高度,箱子要下面的面积比上面的大,这样才能放稳。

动态规划,就是把后面做的建立在前面的基础上,实际上就是分治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

 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值