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
  • 相关阅读:
    Flink开发中的问题
    怎么确定一个Flink job的资源
    Flink统计日活
    Flink读取resource资源文件
    Spark-6-如何缓解消除数据倾斜
    Spark-5-如何定位导致数据倾斜的代码
    Spark-4-为何要处理数据倾斜
    集合遍历删除中遇到问题
    1206
    1205
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/4920300.html
Copyright © 2011-2022 走看看