OJ题目:click here~~
题目分析:求子数组之和的最大值,这里是二维的,转化为一维解决。详见《编程之美》P191.
AC_CODE
const int Max_N = 102;
const int inf = 1<<30;
int PS[Max_N][Max_N];
int BC(int a , int c , int m){
return PS[c][m] - PS[a][m] - PS[c][m - 1] + PS[a][m - 1];
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i , j , k , num[Max_N][Max_N] , maxinum = -inf;
for(i = 1;i <= n;i++)
for(j = 1;j <= n;j++)
scanf("%d",&num[i][j]);
for(i = 0;i <= n;i++)
PS[i][0] = 0,PS[0][i] = 0;
for(i = 1;i <= n;i++)
for(j = 1;j <= n;j++)
PS[i][j] = PS[i - 1][j] + PS[i][j - 1] - PS[i - 1][j - 1] + num[i][j];
for(i = 1;i <= n;i++)
for(j = i;j <= n;j++){
int start = BC(i , j , n);
int all = BC(i , j , n);
for(k = n - 1;k >= 1;k--){
if(start < 0)
start = 0;
start += BC(i , j , k);
if(start > all)
all = start;
}
if(all > maxinum)
maxinum = all;
}
cout << maxinum << endl;
}
return 0;
}