zoukankan      html  css  js  c++  java
  • Uva10755

    在题中的A*B*C的矩形中,当确定X1,X2,Y1,Y2时,1->z的子矩形的和为

    sum[x2][y2][1] -(sum[x1-1][y2][1] + sum[x2][y1-1][1] -sum[x1-1][y1-1][1] + sum[x2][y2][z+1] - sum[x1-1][y2][z+1] -sum[x2][y1-1][z+1] + sum[x1-1][y1-1][z+1]);

    sum[x][y][z]指的是,以(x,y,z)为右下角的矩形的和

    sum[x][y][z]的递推公式为 sum[k][j][i] = (sum[k-1][j][i] + sum[k][j-1][i] -sum[k-1][j-1][i] + sum[k][j][i+1] - sum[k-1][j][i+1] -sum[k][j-1][i+1] + sum[k-1][j-1][i+1] + d[k][j][i]);

    本题最后结果可能会很大,所以ans的初值要赋值为最小的longlong

    #include<bits/stdc++.h>
    
    #define inf 0x3f3f3f3f
    
    const int maxn=20;
    
    using namespace std;
    
    typedef long long ll;
    
    int t;
    
    int a,b,c;
    
    ll d[maxn+10][maxn+10][maxn+10];
    
    ll sum[maxn+10][maxn+10][maxn+10];
    
    int main()
    {
            scanf("%d",&t);
            while(t--){
                    memset(d, 0 ,sizeof(d));
                    memset(sum,0,sizeof(sum));
                    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){
                                            scanf("%lld",&d[i][j][k]);
                                    }
                            }
                    }
    
                    for(int i = c; i >= 1; --i){
                            for(int j = 1; j <= b; ++j){
                                    for(int k = 1; k <= a; ++k){
                                           sum[k][j][i] = (sum[k-1][j][i] + sum[k][j-1][i] -
                                           sum[k-1][j-1][i] + sum[k][j][i+1] - sum[k-1][j][i+1] -
                                           sum[k][j-1][i+1] + sum[k-1][j-1][i+1] + d[k][j][i]);
                                    }
                            }
                    }
    
                    ll ans = -(ll)((1LL)<<63);
                    for(int x1 = 1; x1 <= a; ++x1){
                            for(int x2 = x1; x2 <= a; ++x2){
                                    for(int y1 = 1; y1 <= b; ++y1){
                                            for(int y2 = y1; y2 <= b; ++y2){
                                                    ll min_sumz = 0;
                                                    for(int z = 1; z <= c; ++z){
                                                            ll temp = sum[x2][y2][1] -
                                           (sum[x1-1][y2][1] + sum[x2][y1-1][1] -
                                            sum[x1-1][y1-1][1] + sum[x2][y2][z+1] - sum[x1-1][y2][z+1] -
                                            sum[x2][y1-1][z+1] + sum[x1-1][y1-1][z+1]);
                                                            ans = max(ans, temp - min_sumz);
                                                            min_sumz = min(min_sumz, temp);
                                                    }
                                            }
                                    }
                            }
                    }
    
                    printf("%lld
    ",ans);
                    if(t){
                            printf("
    ");
                    }
            }
        return 0;
    }
  • 相关阅读:
    别再重复造轮子了,利用list创建任意数据类型的链表
    可配置内存池实现
    简单内存池实现
    基于本博客版本中的循环缓冲的测试(Linux环境)
    循环缓冲实现(ring buffer/circular buffer)
    recvfrom超时设置
    Linux系统如何做性能测试?
    深入理解虚拟内存机制
    Linux 内核的测试和调试
    python学习之路 实现简单的计算机功能。
  • 原文地址:https://www.cnblogs.com/GeniusYang/p/6685448.html
Copyright © 2011-2022 走看看