最大子矩阵

来源:互联网 发布:淘宝联盟好还是一淘 编辑:程序博客网 时间:2024/06/05 05:13
// 最大子矩阵// 问题 :// 给个n*m的矩阵,求元素和最大的子矩阵,元素全为负,输出0// 思路 :// 将二维转化为一维,以最大子段和的思路。以行或者以列优先计算都可以,这里是累加列,类似将// 行这一维压缩。思路还是挺简单的,起止位置下标也好说。// 感悟:// 好久好久没刷题了,得捡起来了,余生,请多指教#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MAXN = 502;long long a[MAXN][MAXN];long long b[MAXN][MAXN];const long long INF = 1e9;int n, m;int main() {  // freopen("test.txt", "r", stdin);  while (cin >> m >> n) {    for (int i = 1; i <= n; i++) {      for (int j = 1; j <= m; j++) {        cin >> a[i][j];        b[i][j] = a[i][j];      }    }    for (int j = 1; j <= m; j++) {      for (int i = 1; i <= n; i++) {        a[i][j] += a[i - 1][j];      }    }    long long ans = -INF;    long long dp = 0;    int rowStart = 0;    int rowEnd = 0;    int colStart = 0;    int colEnd = 0;    for (int i = 1; i <= n; i++) {      for (int k = i; k <= n; k++) {        dp = 0;        int colS = 1;        int colE = 1;        for (int j = 1; j <= m; j++) {          if (dp > 0)            dp += a[k][j] - a[i - 1][j];          else {            dp = a[k][j] - a[i - 1][j];            colS = j;          }          if (dp > ans) {            rowStart = i;            rowEnd = k;            colStart = colS;            colEnd = j;            ans = dp;          }        }      }    }    if (ans < 0) {      bool flag = false;      for (int i = rowStart; i <= rowEnd; i++) {        for (int j = colStart; j <= colEnd; j++) {          if (b[i][j] > 0) {            flag = true;          }        }      }      if (!flag)        ans = 0;    }    cout << ans << endl;  }  return 0;}

原创粉丝点击