码迷,mamicode.com
首页 > 其他好文 > 详细

历届试题 最大子阵

时间:2019-01-28 23:56:24      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:初始   htm   using   格式   ret   get   问题   输出   tar   

问题描述
  给定一个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;
}

 

历届试题 最大子阵

标签:初始   htm   using   格式   ret   get   问题   输出   tar   

原文地址:https://www.cnblogs.com/woxiaosade/p/10332176.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!