• Uva 437 巴比伦塔 && UVA10003


    要求底面严格小于它下方立方体的长宽,求出最高情况,一块石头可以多次使用

    用结构体记录一块石头的三种放置情况,按面积排序。

    dp[i] = max(dp[i],dp[j] + block[i].hight);     当选择到i时,与前几个比较,找出当前情况下的高度最高可能

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    struct node
    {
        int x;
        int y;
        int hight;
    }block[100];
    int dp[100];
    bool cmp(node a,node b)
    {
        return a.x*a.y < b.x*b.y;
    }
    
    int main()
    {
        int n,a,b,c,cas = 1;
        while(scanf("%d",&n) && n)
        {
            int tmp = 1;
            for(int i = 0;i < n;i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                block[tmp].x = a;
                block[tmp].y = b;
                block[tmp++].hight = c;
                block[tmp].x = c;
                block[tmp].y = a;
                block[tmp++].hight = b;
                block[tmp].x = b;
                block[tmp].y = c;
                block[tmp++].hight = a;
            }
            sort(block+1,block+tmp,cmp);
            memset(dp,0,sizeof(dp));
            for(int i = 1;i < tmp;i++)
            {
                dp[i] = block[i].hight;
                for(int j = 1;j < i;j++)
                {
                    if(((block[i].x>block[j].x)&&(block[i].y>block[j].y))||((block[i].x>block[j].y)&&(block[i].y>block[j].x)))
                        dp[i] = max(dp[i],dp[j] + block[i].hight);
                }
            }
            int maxn=0;
            for(int i = 1;i < tmp;i++)
                if(dp[i] > maxn)
                    maxn = dp[i];
            printf("Case %d: maximum height = %d
    ",cas++,maxn);
        }
        return 0;
    }</span>
    
    
    
    
    
    
    有一根长10公尺的木棍必须在第2、4、7公尺的地方切割。这个时候就有几种选择了。你可以选择先切2公尺的地方,然后切4公尺的地方,最后切7公尺的地方。这样的选择其成本为:10+8+6=24。因为第一次切时木棍长10公尺,第二次切时木棍长8公尺,第三次切时木棍长6公尺。但是如果你选择先切4公尺的地方,然后切2公尺的地方,最后切7公尺的地方,其成本为:10+4+6=20,这成本就是一个较好的选择。
    你的老板相信你的电脑能力一定可以找出切割一木棍所需最小的成本。
    p[j] - p[i]代表第一刀的费用,切完后吧它变成i~k  和  k~j 两个部分
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define MAX 0x3f3f3f3f
    
    using namespace std;
    
    int len;
    int d[50][50];
    int p[51];
    
    int main()
    {
        int n;
        while(scanf("%d",&n) && n)
        {
            int m;
            scanf("%d",&m);
            for(int i=1; i <= m; i++)
                scanf("%d",&p[i]);
            p[0] = 0,p[m+1] = n;
            memset(d,0,sizeof(d));
    
            for(int l = 2; l <= m+1; l++)
                for(int i = 0; i + l <= m+1; i++)
                {
                    int j = i + l;
                    d[i][j] = MAX;
                    for(int k = i+1; k < j; k++)
                    {
                        d[i][j] = min(d[i][j],d[i][k]+d[k][j]+p[j]-p[i]);
                    }
                }
            printf("The minimum cutting is ");
            printf("%d.
    ",d[0][m+1]);
        }
        return 0;
    }
    
    
     
    

      

  • 相关阅读:
    今天地震了(有震感)...
    上班了!
    C++ 中explicit的作用
    DoModal 函数的用法
    [导入]C++ GUi 选择
    [导入]C++资源之不完全导引(完整版)[转]
    [导入]The GUI Toolkit, Framework Page
    [导入]C/C++中调用SQLITE3的基本步骤
    ACM
    牛客NOIP暑期七天营提高组5+普及组5
  • 原文地址:https://www.cnblogs.com/Przz/p/5409839.html
Copyright © 2020-2023  润新知