Monkey and Banana---hdu1069(dp)

 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069

题意就是给你n种长方体每种类型不限制个数,然后我们把它们一个个堆起来,并且要满足下面的要比上面的大,不能相等,求最大能达到的高度;我们可以把这归为动态规划,求最长上升子序列的问题

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define N 220
struct node
{
    int x,y,z,v,h;
};
int cmp(node a,node b)
{

    return a.v<b.v;
}
int main()
{
    int i,j,x,y,z,n,t=0;
    node a[N];
    while(scanf("%d",&n),n)
    {
        memset(a,0,sizeof(a));
        j=0;
        for(i=0;i<n;i++)
        {
            scanf("%d %d %d",&x,&y,&z);
            a[j].x=x;a[j].y=y;a[j].z=z;a[j].v=x*y;j++;
            a[j].x=y;a[j].y=z;a[j].z=x;a[j].v=y*z;j++;
            a[j].x=z;a[j].y=x;a[j].z=y;a[j].v=x*z;j++;
        }
        sort(a,a+j,cmp);
        for(i=0;i<n*3;i++)
        {
            int MAX=0;
            for(j=0;j<i;j++)
            {
                if(((a[i].x>a[j].y&&a[i].y>a[j].x)||(a[i].x>a[j].x&&a[i].y>a[j].y))&&a[j].h>MAX)
                {
                    MAX=a[j].h;
                }
            }
            a[i].h=a[i].z+MAX;
        }
        int ans=0;
        for(i=0;i<3*n;i++)
        {
            ans=max(ans,a[i].h);
        }
        t++;
        printf("Case %d: maximum height = %d\n",t,ans);
    }
    return 0;
}
View Code

后来又写了一遍...都差不多:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
using namespace std;
#define N 1010
struct node
{
    int x,y,w;
}a[N];

int cmp(node p, node q)
{
    if(p.x != q.x)
        return p.x<q.x;
    return p.y<q.y;
}

int main()
{
    int n, x, y, z, dp[N], t=1;
    while(scanf("%d", &n), n)
    {
        int k = 0;
        for(int i=0; i<n; i++)
        {
            scanf("%d%d%d", &x, &y, &z);
            if(x>y)swap(x, y);
            if(x>z)swap(x, z);
            if(y>z)swap(y, z);
            a[k].x=x; a[k].y=y; a[k++].w=z;
            a[k].x=x; a[k].y=z; a[k++].w=y;
            a[k].x=y; a[k].y=z; a[k++].w=x;
        }
        sort(a, a+k, cmp);
        memset(dp, 0 , sizeof(dp));
        int ans = 0;
        for(int i=0; i<k; i++)
        {
            dp[i] = a[i].w;
            for(int j=0; j<i; j++)
            {
                if(a[i].x>a[j].x && a[i].y>a[j].y)
                    dp[i]=max(dp[i], dp[j]+a[i].w);
            }
            ans = max(ans, dp[i]);///dp[k-1]不一定是最大的;这是突然明白的-_-;
        }
        printf("Case %d: maximum height = %d\n", t++, ans);
    }
    return 0;
}
View Code

 

posted @ 2015-05-04 20:41  西瓜不懂柠檬的酸  Views(175)  Comments(0)    收藏  举报
levels of contents