• 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;
    }
    
    
     
    

      

  • 相关阅读:
    [Python] 糗事百科文本数据的抓取
    [Python] 文件扫描
    [Python] 根据博客园用户名抓取其所有文章的标题及其链接
    ParagraphString
    IrregularGridCollectionView处理不定宽度的标签cell
    Java多线程与并发
    设计模式之代理模式
    javascript设置百分比保留两位小数。
    Java基础知识总结(异常机制、集合、JUC、IO)
    Java底层知识JVM、GC
  • 原文地址:https://www.cnblogs.com/Przz/p/5409839.html
Copyright © 2020-2023  润新知