题目链接:Click here~~
题意:
RT。
解题思路:
想办法将二维转化成一维问题,观察矩阵和的特点我们不难发现,它将所选取的矩阵的每行每列都相加。
于是我们可以枚举所有可能选取的首行和尾行,然后将其中每列的元素加到一起,存入一个数组a[ ]。
然后,数组a[ ]中连续的元素就相当于一个连续的列,而首行和尾行也已经确定,所以数组a[ ]中连续元素的和就相当于一个矩阵的和。
然后问题就转化成了求数组a[ ]的最大连续子序列和。复杂度O(n^3)。
#include <stdio.h>
#include <string.h>
#include <limits.h>
int main()
{
int n,R,C,w[102][102],a[102];
while(~scanf("%d",&n))
{
R = C = n;
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
scanf("%d",&w[i][j]);
int ans = INT_MIN;
for(int i=1;i<=R;i++)
{
memset(a,0,sizeof(a));
for(int j=i;j<=R;j++)
{
int sum = -1;
for(int k=1;k<=C;k++)
a[k] += w[j][k];
for(int k=1;k<=C;k++)
{
sum = sum<0 ? a[k] : sum+a[k];
if(ans < sum)
ans = sum;
}
}
}
printf("%d\n",ans);
}
}