const int Max_N = 10008 ;
int N , x[Max_N] ;
void Ans(){
int Max_sum = -0xffff ; // 最大和初值为最小
int Start = 1, End = 1 , sum = 0 , i , j = 1 ;
for(i = 1 ; i <= N ; i++){
sum += x[i] ;
if(sum < 0){
sum = 0 ;
j = i + 1 ; //当前和不能作为结果,更新sum ,同时下一个序列起点为下一点i+1 。
}
else if(sum > Max_sum){ //更新 ,当前点为终点。同时更新起点j
Max_sum = sum ;
Start = j ;
End = i ;
}
}
if(Max_sum == -0xffff) //最大值为初值,说明全为负数。
printf("%d %d %d\n" , 0 , x[1] , x[N]) ;
else
printf("%d %d %d\n" , Max_sum , x[Start] , x[End]) ;
}
HDU 1003 Max Sum 最大子段和
const int Max_N = 100008 ;
int N , x[Max_N] ;
void Ans(){
int Max_sum = -0xffff ; //
int Start = 1, End = 1 , sum = 0 , i , j = 1 ;
for(i = 1 ; i <= N ; i++){
sum += x[i] ;
if(sum > Max_sum){
Max_sum = sum ;
Start = j ;
End = i ;
}
if(sum < 0){
sum = 0 ;
j = i + 1 ;
}
}
printf("%d %d %d\n" , Max_sum , Start , End) ;
}
最大子矩阵 To the Max
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=74
int MaxSum(int n , int a[]){
int sum = - 128 ;
int b = 0 ;
for(int i = 1 ; i <= n ; i++){
if(b > 0) b += a[i] ;
else b = a[i] ;
if(b > sum) sum = b ;
}
return sum ;
}
const int Max_N = 108 ;
int g[Max_N][Max_N] ;
int sum[Max_N][Max_N] ;
int N ;
int num[Max_N] ;
int GetMax(){
int i , j , t , k , ans = -128 ;
memset(sum , 0 , sizeof(sum)) ;
for(i = 1 ; i <= N ; i++)
sum[1][i] = g[1][i] ;
for(i = 2 ; i <= N ; i++){
for(j = 1 ; j <= N ; j++)
sum[i][j] = sum[i-1][j] + g[i][j] ;
}
for(i = 1 ; i <= N ; i++){
for(j = i ; j <= N ; j++){
for(k = 1 ; k <= N ; k++)
num[k] = sum[j][k] - sum[i-1][k] ;
ans = max(ans , MaxSum(N , num)) ;
}
}
return ans ;
}
int main(){
int i , j ;
while(cin>>N){
for(i = 1 ; i <= N ; i++)
for(j = 1 ; j <= N ; j++)
cin>>g[i][j] ;
cout<<GetMax()<<endl ;
}
return 0 ;
}