• 最大的和


     

     

     解析转载自https://www.acwing.com/solution/content/4127/

    =====转载开始=====

    左上角和右下角两个点可以确定一个矩形。枚举这两个点要用4个for循环 如果用二维前缀和,那么这个做法的复杂度的就是O(n^4)。

    其实这个方案可以优化,那就是不枚举点。

     

    所以我们可以利用前缀和数组表示出每个色块表示的值,然后做类似找一维数组最大连续和的操作。这样来枚举出最优矩形。

    枚举边界要用3个for,复杂度为 O(n^3)

    =====转载结束=====

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 110;
     4 int a[N][N];
     5 int main() {
     6     int n;
     7     cin >> n;
     8     for (int i = 1; i <= n; i++) {
     9         for (int j = 1; j <= n; j++) {
    10             cin >> a[i][j];
    11             a[i][j] += a[i - 1][j]; //同一列的前缀和
    12         }
    13     }
    14     int res = -2e9;
    15     for (int i = 1; i <= n; i++) { //枚举边界1
    16         for (int j = i; j <= n; j++) { //枚举边界2
    17             int last = 0;
    18             for (int k = 1; k <= n; k++) { //枚举边界
    19                 //last是前面数字的最大和如果小于0 舍弃
    20                 last = max(last, 0) + a[j][k] - a[i - 1][k]; 
    21                 res = max(res, last);
    22             }
    23         }
    24     }
    25     cout << res << endl;
    26     return 0;
    27 }
  • 相关阅读:
    bzoj 2138: stone
    LOJ #6062. 「2017 山东一轮集训 Day2」Pair
    bzoj 5341: [Ctsc2018]暴力写挂
    UOJ #356. 【JOI2017春季合宿】Port Facility
    UOJ #357. 【JOI2017春季合宿】Sparklers
    UOJ #349. 【WC2018】即时战略
    bzoj 3600: 没有人的算术
    Codeforces 960G. Bandit Blues
    codeforces524E
    codeforces193B
  • 原文地址:https://www.cnblogs.com/fx1998/p/14033056.html
Copyright © 2020-2023  润新知