历届试题 最大子阵

问题描述
  给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。

  其中,A的子矩阵指在A中行和列均连续的一块。
输入格式
  输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。
  接下来n行,每行m个整数,表示矩阵A。
输出格式
  输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。
样例输入
3 3
-1 -4 3
3 4 -1
-5 -2 8
样例输出
10
样例说明
  取最后一列,和为10。
数据规模和约定
  对于50%的数据,1<=n, m<=50;
  对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。
 
解题思路:
这是个最大字段和的问题,请参考我的一篇博客。
注意:在求最大值时,一定让其初始值为一个很小的负数
#include <stdio.h>
#include <iostream> 
using namespace std; 
int MaxSum();
int col[510][510] ;
int n,m;
int main(){
    cin >>n>>m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            int t; 
            scanf("%d",&t);
            if(i==0)
                col[j][0] = t;
            else
                col[j][i] = t + col[j][i-1];
        }
    }
    cout<<MaxSum();
    return 0;
}
int MaxSum(){
    int max_t=-9999999999;
    for(int r0=0;r0<n;r0++){
        for(int r1=r0;r1<n;r1++){
            int b = 0;
            for(int i=0; i<m; i++){
                if(b>=0){
                    if(r0==0)
                        b+=col[i][r1];
                    else
                        b+=col[i][r1] - col[i][r0-1];
                }
                else{
                    if(r0==0)
                        b=col[i][r1];
                    else
                        b=col[i][r1] - col[i][r0-1];
                }    
                max_t = max_t > b? max_t : b;
            }
        }
    }
    return max_t;
}

猜你喜欢

转载自www.cnblogs.com/woxiaosade/p/10332176.html