tf girl

路漫漫其修远兮,吾将上下而求索。

导航

ZOJ1093 Monkey and Banana 【DP】

一、题目

ZOJ 1093

二、题目源程序

#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);//用d,b,c防止后面把前面覆盖。
            a[j].x=d;a[j].y=b;a[j++].z=c;
            a[j].x=d;a[j].y=c;a[j++].z=b;
            a[j].x=b;a[j].y=d;a[j++].z=c;
            a[j].x=b;a[j].y=c;a[j++].z=d;
            a[j].x=c;a[j].y=b;a[j++].z=d;
            a[j].x=c;a[j].y=d;a[j++].z=b;
          }
         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;
}

三、解题思路

1. 结构体利用   qsort()   函数排序。

2. 简单的动态规划问题。

四、心得体会

虽然这道题属于动态规划里的超基础水题,可是这是我做的第一道DP题目,花费了很长时间,都没有做出来。

最后看了大神的博客,才终于把它AC掉。

DP是很重要、占很大比重的一部分,一定要多做题!!

posted on 2014-07-23 16:28  tf girl  阅读(186)  评论(0编辑  收藏  举报