题目描述
给定一个正整数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);
}