zoukankan      html  css  js  c++  java
  • 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
    ",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
    ", t++, ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    前后端分离项目本地测试跨域问题配置
    STS没有找到Dynamic Web Project
    java常见面试题
    log4jdbc 使用
    Thymeleaf 入门
    集成maven和Spring boot的profile 专题
    ftp命令大全
    windows下安装redis
    linux安装环境
    atmega328 熔丝
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4477212.html
Copyright © 2011-2022 走看看