题意很简单:求一个矩阵中子矩阵元素和的最大值。

  思路:穷举任意两行,对这两行的列和求最大子段。最大子段递归方程:s[k] = (s[k-1]>0) ? (s[k-1]+ a[k]) : a[k]。s[k]表示以a[k]结尾的最大子段和,

方程式的意思是,如果s[k-1]>0则以a[k]结尾的最大子段包括前面的子段,否则以a[k]结尾的最大子段就是它本身。

 代码:

#include<cstdio>
using namespace std;

int n;
int matrix[100][100];
int s[100];

int get_max(){
int max = -127 * 100 * 100;
for(int i=0; i<n; i++)
for(int j=i; j<n; j++){
int a = 0;
for(int x=i; x<=j; x++)
a
+= matrix[x][0];
s[
0] = a;
if(s[0] > max)
max
= s[0];

for(int k=1; k<n; k++){
a
= 0;
for(int x=i; x<=j; x++)
a
+= matrix[x][k];
if(s[k-1]>0)
s[k]
= s[k-1] + a;
else
s[k]
= a;

if(s[k] > max)
max
= s[k];
}
}
return max;
}

int main(){
// freopen("in", "r", stdin);

while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
scanf(
"%d", &matrix[i][j]);

int max;
max
= get_max();
printf(
"%d\n", max);
}
}

 

 

 

s[k] = (s[k-1]>0) ? (s[k-1]+ a) : as[k] = (s[k-1]>0) ? (s[k-1]+ a) : a
posted on 2010-07-08 22:27  yongmou-  阅读(440)  评论(0编辑  收藏  举报