题意:求一个矩阵环(循环矩阵)的最大子矩阵和。
题解:uva 108的加强版。。初做dp,围观大牛做法,因为是循环矩阵,所以将矩阵扩大一倍,由四个初始矩阵组成,然后开始在n*n的矩阵内选起始点,然后选择矩阵的长宽(都要小于n),计算过程中保存计算结果,dp基本思想。
#include <stdio.h>
#include <string.h>
const int N = 200;
const int INF = -0x3f3f3f3f;
int main() {
int t, n, s[N][N], maxx, sum[N], sum2[N];
scanf("%d", &t);
while (t--) {
maxx = INF;
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
scanf("%d", &s[i][j]);
s[i + n][j] = s[i][j + n] = s[i + n][j + n] = s[i][j];
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int p = 0; p < n; p++)
for (int q = 0; q < n; q++) {
sum[q] = s[q + i][p + j];
if (q)
sum[q] += sum[q - 1];
if (p)
sum2[q] += sum[q];
else
sum2[q] = sum[q];
if (sum2[q] > maxx)
maxx = sum2[q];
}
printf("%d\n", maxx);
}
}