zoukankan      html  css  js  c++  java
  • 历届试题 最大子阵

    问题描述
      给定一个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;
    }
  • 相关阅读:
    工具 Dotnet IL Editor 推荐
    VC6.0开发OCX按钮控件
    变量共享分析(Thread)
    一个月掌握VC++2010?
    细说Angular ngclass
    2013 北京 QCon热点分享
    RadioButtonList
    NSubstitute完全手册1
    使用MEF实用IOC(依赖倒置)
    发布订阅模式 之 同步订阅、异步订阅和离线订阅
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/10332176.html
Copyright © 2011-2022 走看看