zoukankan      html  css  js  c++  java
  • Uva 10755 Garbage Heap

    Uva 10755

    给出一个立体图,要求求出其中的最大子立方体。

    如果给出的是一个二维图,那么可以使用前缀矩形来做,用a[i][j]代表以(1~i)为长,以(1~j)为宽的矩形,那么a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+cube[i][j];

    之后就可以通过枚举两个i和两个j(即任意两行两列)之间的子矩形,等到这个二维图的最大子矩形。同样的,三维图也可以通过这个思想来解决,枚举二维,把其他的压缩到一层上,之后又可以通过求最大子段和的方法得这一层的最大子立方体。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn=30;
    long long cube[maxn][maxn][maxn];
    long long ans;
    int a,b,c;
    
    void Init()
    {
        memset(cube,0,sizeof(cube));
        ans=-1e10;
        scanf("%d%d%d",&a,&b,&c);
        for(int i=1; i<=a; i++)
            for(int j=1; j<=b; j++)
                for(int k=1; k<=c; k++)
                {
                    cin>>cube[i][j][k];
                    cube[i][j][k] += cube[i][j][k-1]-cube[i][j-1][k-1]+cube[i][j-1][k]
                                     - (cube[i-1][j][k-1]-cube[i-1][j-1][k-1]+cube[i-1][j-1][k])
                                     + cube[i-1][j][k];
                }
    }
    
    void Work()
    {
        for(int down=0; down<a; down++)
            for(int up=down+1; up<=a; up++)
                for(int head=0; head<b; head++)
                    for(int deap=head+1; deap<=b; deap++)
                    {
                        long long minx=0,sum;
                        for(int i=1; i<=c; i++)
                        {
                            sum=(cube[up][deap][i]-cube[down][deap][i])-
                                (cube[up][head][i]-cube[down][head][i]);
                            ans=max(ans,sum-minx);
                            minx=min(minx,sum);
                        }
                    }
    }
    
    void Print()
    {
        cout<<ans<<endl;
    }
    
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            Init();
            Work();
            Print();
            if(t) puts("");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    chrome浏览页面常用快捷键 && 常见的HTTP状态码
    hasCode详解
    队例初始化问题(Queue)
    新手问题--双链表最后一个节点无法删除问题
    高级排序--快速排序
    高级排序--归并排序
    高级排序--希尔排序
    简单排序--插入排序
    简单排序--选择排序
    简单排序--冒泡排序
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/4920300.html
Copyright © 2011-2022 走看看