zoj 1093 Monkey and Banana 简单dP 入门

这是前几天的题,题目之前一直没时间上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

 
 
 

你可能感兴趣的:(zoj 1093 Monkey and Banana 简单dP 入门)