zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
     
    

      

  • 相关阅读:
    tcp单线程实现并发
    文件处理
    异常处理、深浅拷贝、基本的文件操作
    列表、元组、字典、集合类型的内置方法
    python进阶之数字类型内置方法和字符串类型内置方法
    九九乘法表和金字塔
    python基础总结
    0801学习整理
    0731学习内容整理
    0730学习内容整理
  • 原文地址:https://www.cnblogs.com/Przz/p/5409839.html
Copyright © 2011-2022 走看看