hdu 1069 Monkey and Banana 动态规划(最长递增子序列变形)

http://acm.hdu.edu.cn/showproblem.php?pid=1069

#include<stdio.h>
#include<stdlib.h>
typedef struct abc{
int
x,y,z;
}
abc;
abc  a[100];//定义结构体,里边分别存,长宽高;
int k;
int
cmp( const void *a,const void *b)
{

abc *c,*d;
c=(abc *)a;
d=(abc *)b;
if
(c->x!=d->x)
  return
c->x-d->x;
else
  return
c->y-d->y;//对结构体数组进行预处理:即将长进行从小到大的排序;
                         // 这样可以将问题转换为简单的DP问题;
}
int
dp()//类似于求最长上升子序列的问题;
{
int
ans,i,j;
for
(i=1;i<k;i++)
{

  ans=0;//初始化a[i]前满足条件的最大值;
  for(j=0;j<i;j++)//进行双重循环,当存在a[i]时,求a[i]及a[i]之前的满足条件的高度和的最大值,把它置为a[i].z;
  {
   if
(a[j].x<a[i].x&&a[i].y>a[j].y&&a[j].z>ans)
   {

    ans=a[j].z;
   }
  }

   a[i].z=ans+a[j].z;
 
}

ans=a[0].z;
for
(i=1;i<k;i++)
  if
(a[i].z>ans)
   ans=a[i].z;
  return
ans;




}

int
main()
{

int
n,i,m=1,t,ans;
while
(scanf("%d",&n),n!=0)
{

   k=0;
  for
(i=0;i<n;i++)
  {


   scanf("%d %d %d",&a[k].x,&a[k].y,&a[k].z);
   if
(a[k].x!=a[k].z)//像8,9,10这块砖其实可以转换为9,8.10和9,10,8,这三款砖;但
   {     //5,5,5就只能是这一块砖,所以就看知否有相同长。宽;
    k++;
    a[k].x=a[k-1].z;
    a[k].y=a[k-1].y;
    a[k].z=a[k-1].x;
   }

   if
(a[k].y!=a[k].z)
   {

    k++;

    a[k].x=a[k-1].x;
    a[k].y=a[k-1].z;
    a[k].z=a[k-1].y;
   }

   k++;
  }

 
  for
(i=0;i<k;i++)
  {

   if
(a[i].x>a[i].y)
   {

    t=a[i].x;
    a[i].x=a[i].y;
    a[i].y=t;
   }
  }

  qsort(a,k,sizeof(a[0]),cmp);
  ans=dp();
  printf("Case %d: maximum height = %d\n",m,ans);
 
  m++;
}

return
0;
}


posted @ 2013-04-30 17:22  galaxy77  阅读(165)  评论(0编辑  收藏  举报