dp[i] = max(dp[i - 1) + a[i], a[i])
刚刚看到POJ1050这个题目,也想着顺着这个思路扩展,但是不得其解,无法构造状态转移方程。后来看了别人的解题报告,才恍然大悟,最最重要的是要将二维想办法变成一维的解决。假设d[i][j]表示第i行到第j行的子矩阵和最大值。一些情况:- 最基础的就是每一列自己构成一个矩阵。
- 每两列
- 每三列
- ...
#include
int rect[101][101];
int a[101], dp[101];
int n, mx;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
scanf("%d", &rect[i][j]);
mx = 0;
for (int i = 1; i <= n; ++i)
for (int j = i; j <= n; ++j) {
for (int k = 1; k <= n; ++k) {
a[k] = 0;
for (int m = i; m <= j; ++m) {
a[k] += rect[m][k];
}
}
dp[0] = 0;
for (int k = 1; k <= n; ++k) {
if (a[k] > dp[k - 1] + a[k])
dp[k] = a[k];
else
dp[k] = dp[k - 1] + a[k];
if (dp[k] > mx)
mx = dp[k];
}
}
printf("%d", mx);
return 0;
}