【動態規劃】最大加權矩形

题目描述

给定一个正整数n( n<=100),然后输入一个N*N矩阵。求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。矩阵的每个元素属于[-127,127]
例:
0 –2 –7 0 在左下角: 9 2
9 2 –6 2 -4 1
-4 1 –4 1 -1 8
-1 8 0 –2 和为15
输入格式

第一行:n,接下来是n行n列的矩阵。
输出格式

最大矩形(子矩阵)的和。
样例输入
4 0 –2 –7 0 9 2 –6 2 -4 1 –4 1 –1 8 0 –2
样例输出
15

最大子矩形問題,類似於吃西瓜。

ACCode:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <bitset>

using std::max;

const char fi[] = "rqnoj106.in";
const char fo[] = "rqnoj106.out";
const int maxN = 110;
const int MAX = 0x3fffff00;
const int MIN = -MAX;

int sum[maxN][maxN];
int w[maxN][maxN];
int n, ans;

  void init_file()
  {
    freopen(fi, "r", stdin);
    freopen(fo, "w", stdout);
  }
  
  void readdata()
  {
    scanf("%d", &n);
    for (int i = 1; i < n + 1; ++i)
     for (int j = 1; j < n + 1; ++j)
      scanf("%d", &w[i][j]);
  }
  
  void work()
  {
    for (int i = 1; i < n + 1; ++i)
     for (int j = 1; j < n + 1; ++j)
      sum[i][j] = sum[i - 1][j] + w[i][j];
    ans = 0;
    for (int i1 = 0; i1 < n; ++i1)
     for (int i2 = i1 + 1; i2 < n + 1; ++i2)
      {
        int Max = sum[i2][1] - sum[i1][1];
        int tmp = Max;
        for (int j = 2; j < n + 1; ++j)
        {
          tmp = max(0, tmp);
          tmp += sum[i2][j] - sum[i1][j];
          Max = max(Max, tmp);
        }
        ans = max(Max, ans);
      }
    printf("%d", ans);
  }
  
int main()
{
  init_file();
  readdata();
  work();
  exit(0);
}


你可能感兴趣的:(【動態規劃】最大加權矩形)