WA了好多次,为了对应全是负数的情况,需要多借助一个变量,缓存一个begin位置,只在最大值更新时才更新begin的值。
扩展1:数组有可能是环状的,http://cs.scu.edu.cn/soj/problem.action?id=2766
这时候需要比较,正常求出的max1和跨段的max2,取最大值。跨度max2的求法 = 数组的sum - 连续和的最小值
扩展2:由一维扩展到二维数组。求矩阵中的最小和(http://poj.org/problem?id=1050)。
#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;
using namespace std;
//存储以坐标i,j到1,1的面积,用于计算面积
int P[101][101] = {0};
//用于存储矩阵
int Matrix[101][101] = {0};
//初始化数组P
void init(int N)
{
for(int i=0;i<=N;i++)
P[i][0] = 0;
for(int i=0;i<=N;i++)
P[0][i] = 0;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
P[i][j] = P[i-1][j] + P[i][j-1] - P[i-1][j-1] + Matrix[i][j];
}
//求长条矩阵的和,横坐标为x,纵坐标从y1到y2的长条的和。y2>y1
int lsum(int y1,int y2,int x)
{
int sum = P[x][y2] - P[x][y1-1] - P[x-1][y2] + P[x-1][y1-1];
//cout<<sum<<endl;
return sum;
}
int main()
{
int N;
while(scanf("%d",&N)==1)
{
int temp = 0;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
scanf("%d",&Matrix[i][j]);
init(N);
int y1,y2,x;
int maxMatrix = -65535;
int sumMatrix;
for(y1=1;y1<N;y1++)
for(y2=y1;y2<=N;y2++)
{
sumMatrix = 0;
for(x=1;x<=N;x++)
{
sumMatrix += lsum(y1,y2,x);
if(sumMatrix>maxMatrix)
{
maxMatrix = sumMatrix;
}
if(sumMatrix<0)
sumMatrix = 0;
}
}
cout<<maxMatrix<<endl;
}
return 0;
}