数据结构算法题/最大子矩阵(二维数组中和最大的连续子矩阵)_fkyyly的博客-程序员资料

技术标签: 算法导论  

给定一个矩阵,都是整数,求出其中的最大子矩阵。

可以将问题转换为求一维数组的最大子序列和的问题。具体见https://blog.csdn.net/fkyyly/article/details/83088247

/**
 * 其实思想是控制新的子矩阵开始,按列相加变成一维数组,然后再求一维数组最大子序列的和,
 * 最后在多个最大子序列的和中返回最大的那个
 * 然后对如上获取的不同子矩阵分别按列相加生成很多的一维数组
 * 然后对每个数组分别求最大子数组的和(因为是求最大子数组的和,所以只需要控制开始的行,不需要控制结束的行也不需要控制开始和结束的列)
 * 因为求最大子数组的和可以是中间几个元素的和
 * 然后从所有子数组对应的最大子数组的和中选出最大的值
 *
 * 个人认为如果是限制行的开始,那么就按列相加,然后对一维数组求最大子数组的和
 * 如果是限制列的开始,那么就按行相加,然后对一维数组求最大子数组的和
 */
public class MaxSumofMatrix {
    public static void main(String[] args) {
        //最大子矩阵的累加和
        int matrix[][]={
   {-1,-1,-1},{1,2,2},{8,-7,-1},{-1,100,-1}};
        maxMatrixSum(matrix);
    }

    public static void maxMatrixSum(int matrix[][])
    {
        if(matrix==null||matrix.length==0)
            return;
        int max=0;
        int col=matrix[0].length,row=matrix.length;
        for(int i=0;i<col;i++)
        {
            int arr[]=new int[col];//存储对应列的和,按列相加

            //表示子矩阵从i行开始
            for(int j=i;j<row;j++)
            {
                //下面的循环结合上面的循环就是按列相加
                //所以有多少列,arr就有多少个数
                for(int k=0;k<col;k++)
                {
                    arr[k]+=matrix[j][k];
                    // 如果子矩阵是从0开始的话也就是j=i=0,arr[0]=matrix[0][0]+matrix[1][0]+matrix[2][0]+matrix[3][0]+...(所有行的第0个元素)
                    // 如果子矩阵是从1开始的话也就是j=i=1,arr[0]=matrix[1][0]+matrix[2][0]+matrix[3][0]+...(去除第0行的第0个元素)
                    // 如果子矩阵是从1开始的话也就是j=i=10,arr[0]=matrix[10][0](去除前9行的第0个元素)
                    // 比较上面三个表达式,行数在减少
                    // 将每子行的值进行相加然后利用子数组的最大和就可以求出子矩阵的最大和
                }
                max=Math.max(maxArrSum(arr), max);
                //求出数组的子数组和最大值
            }
        }
        System.out.println(max);
    }


    public static int maxArrSum(int arr[])
    {
        int max=0,sum=0;
        for(int i=0;i<arr.length;i++)
        {
            if(sum<=0)
            {
                sum=arr[i];
            }
            else {
                sum+=arr[i];
            }
            max=Math.max(sum, max);
        }
        return max;
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fkyyly/article/details/84111268

智能推荐

python统计中文字符_使用 Python 统计中文字符的数量_weixin_39527487的博客-程序员资料

使用 Python 统计中文字符的数量方法一,排除法假设只有中英文字符:import stringdef str_count(str):'''找出字符串中的中英文、空格、数字、标点符号个数'''count_en = count_dg = count_sp = count_zh = count_pu = 0for s in str:# 英文if s in string.ascii_letters:c...

Redis——Windows安装_redis windows安装包_普通网友的博客-程序员资料

redis-server.exe --service-install redis.windows.conf --Service-name RedisServer2 --loglevel verbose --port 6380,这样也是指定端口安装。进入Redis安装包文件下,注册服务:redis-server.exe --service-install redis.windows.conf --Service-name RedisServer1 --loglevel verbose。

-bash: lsb_release: 未找到命令_suchcl的博客-程序员资料

今天在centos7.3的系统中使用lsb_release -a查看系统版本的时候,没有如预期一样给我出现系统版本号的相关信息,而是报错了,-bash: lsb_release: 未找到命令后来一查,原来lsb命令并不是系统默认给安装好的,如果要使用该命令,需要自行安装了命令才可以使用。安装方式:yum install -y redhat-lsb不用管它,自行安装即可,大...

zookeeper+kafka集群安装部署(二)_WFkwYu的博客-程序员资料

kafka消息队列服务安装部署基础环境:三台服务器:IP1:192.168.37.21IP2:192.168.37.22IP3::192.168.37.23说明:确保zookeeper集群已经在上面三台服务器上部署成功一、安装jdk环境变量参考地址:https://blog.csdn.net/qq_35663625/article/details/98848947二、安装kafk...

公钥密码体制-Paillier (一)_paillier密码体制_Henzox的博客-程序员资料

背景Paillier 加密系统是 Pascal Paillier 在 1999 年发明的。属于公钥密码体制范畴。至于什么是公钥密码体制,在RSA 中已经介绍,这里直接介绍算法的原理。

随便推点

FPGA练习:与门电路的实现_fpga与门代码_许野平的博客-程序员资料

1. 与门的 verilog 实现代码设计一个与门电路,实现 y = a &amp; b。verilog 代码如下:module addgate(a, b, y); input a; input b; output y; wire a; wire b; wire y; assign y = a &amp; b;endmodule 其中,wire 代表连线。也就是说,a、b、y 都是连线,assign 赋值的意思,就是说 = 号两边直接用线连起来。2. 测试代码测试代码如下:

SQLite3性能优化_pragma cache_size_tietao的博客-程序员资料

SQLite3性能调整主要通过pragma指令来实现。比如调整:空间释放、磁盘同步、Cache大小等。一.空间释放1.如何查询:PRAGMA auto_vacuum;含义:查询数据库的auto-vacuum标记。2.标记含义:auto-vacuum标记的含义:正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加操

Jenkinsfile+git+Email Ext配置邮件发送_jenkinsfile 发送邮件_黑小白_king的博客-程序员资料

本文内容:Jenkinsfile+Email Extension Plugin插件取代jenkins自带邮件发送功能,自定义发送邮件环境:Jenkins+Email Extension Plugin,拉取github仓库代码注意事项:由于我是手写jenkinsfile,不是利用jenkins web界面进行配置,所以这里只讲述jenkinsfile+Email Extension Plugin,如...

文件(csv、excel、xml、html)的读取(read)和写入(write)方法——python_weixin_30526593的博客-程序员资料

读取:一、CSV格式:csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据。1.csv模块&amp;reader方法读取:import csvwith open('enrollments.csv', 'rb') as f: reader = csv.reader(f)print readerout:&lt;...

自然语言处理之Bag-of-words,TF-IDF模型_林林同學的博客-程序员资料

Bag-of-words,TF-IDF模型Bag-of-words model (BoW model)忽略文本的语法和语序,用一组无序的单词(words)来表达一段文字或一个文档,近年来BoW 模型被广泛应用于计算机视觉中,与应用于文本的BoW 类比,图像的特征(feature)被当作单词(Word)。 应用于文本的BoW modelJohn likes to watch movies. Mary

数据结构课程设计(十一)---关键路径问题_关键路径课程设计_NUAA&XMU---朱林昊的博客-程序员资料

1、任务简述:设计实现AOE网的关键活动与关键路径问题要求:(1)自行建立图的数据文件,以邻接表或者邻接矩阵表示图皆可,显示输出原图(按照邻接表的样式);(2)计算出各个事件的最早发生时间与最迟发生时间,并显示输出;(3)输出所有的关键路径。2、算法描述:数据结构:typedef struct arc{int index; //编号float weight; //权重struct arc *next; //指向下一个节点}AR;typedef struct MyGraph{i

推荐文章

热门文章

相关标签