题目链接:POJ1050
题目大意是在一个矩阵中求能使和最大的子矩阵,自己想了好一会但是没想出来,后来去找了解题报告。大致就是把一个矩阵压缩成一维的数组,然后求最大的字串和。
比如
3 1 2
5 7 8
1 2 3
三行压缩成一行就成了
9 10 13
然后,用暴力,从不压缩,到全压缩,然后从第几行开始压缩。最后找出那个最大值就行了。
提交的代码里面很多的代码时间比我的代码还少了一半,不知道是代码上做了优化,还是有新的解题思路。要是知道的话,希望可以给我留言一下哈。
下面是我的代码:
/*Source Code
Problem: 1050 User: Bearox
Memory: 172K Time: 32MS
Language: C++ Result: Accepted
Source Code*/
#include<stdio.h>
# define N 105
# define M -127
int main()
{
int a[N][N];
int max;
int f[N], b[N];
int n;
int i, j, k, p;
while(scanf("%d", &n) != EOF)
{
max = M;
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= n; ++j)
scanf("%d", a[i] + j);
}
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= n - i + 1; ++j)
{
for(k = 1; k <= n; ++k)
{
b[k] = 0;
for(p = 0; p < i; ++p)
b[k] += a[j + p][k];
if(k == 1)
f[1] = b[1];
else
f[k] = f[k - 1] > 0? f[k - 1] + b[k]:b[k];
max = max > f[k]? max : f[k];
}
}
}
printf("%d\n", max);
}
return 0;
}