HDU 1081 求最大子矩形 dp

来源:互联网 发布:华沙 知乎 编辑:程序博客网 时间:2024/05/19 03:30

这个题有树状数组的办法,这里我给出一种dp的办法,首先如果这个题目是一维的,那么应该都会做,要是多维的呢 ? 首先我们看一下一维的情况 比如 1 2 3 4 ans = 10,如果是二维的话我们就可以将第二维度压到第一维度, 3 4 5 6 加起来之后就是 4 5 6 7 ans = 22 以此类推就可以了。 取连续的子矩形才可以这么做的。

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cmath>using namespace std;const int INF = 1e9 + 7;const int maxn = 105;int n;int a[maxn][maxn] = {0};int sum[maxn] = {0};int solve () {    int res = -INF;    int temp = 0;    for (int i = 1;i <= n; ++ i) {        temp += sum[i];        if (temp > res) res = temp;        if (temp < 0) temp = 0;    }    return res;}int main () {    ios_base :: sync_with_stdio(false);    while (cin >> n) {        int ans = -INF;        for (int i = 1;i <= n; ++ i) {            for (int j = 1;j <= n; ++ j) {                cin >> a[i][j];            }        }        for (int i = 1;i <= n; ++ i) {            memset (sum,0,sizeof (sum));            for (int j = i;j <= n; ++ j) {                for (int k = 1;k <= n; ++ k) {                    sum[k] += a[j][k];                }                int temp = solve();                ans = max (ans,temp);            }        }        cout << ans << endl;    }    return 0;}