算法总结之 子矩阵的最大累加和问题

给定一个矩阵matrix, 其中的值有正 负 0 ,返回子矩阵的最大累加和

这个是  子数组最大累加和问题的 升级版

看例子就懂了:

如果只有两行,那么  上下两行相加,得出列加数组  得出最大累加和

总结整个过程,关键之处在于:

用求累加数组的最大累加和是的的方式得到每一步的最大子矩阵的累加和

每一步的累加数组可以利用前一步求出的累加数组很方便的更新得到

上代码:

package TT;

public class Test77 {

     public static int maxSum(int[][] m){
          if(m==null || m.length==0 || m[0].length==0){
              return 0;
          }

          int max  = Integer.MIN_VALUE;
          int cur = 0;
          int[] s = null;

          for(int i =0; i!=m.length; i++){
              s = new int[m[0].length];
              for (int j = i; j != m.length; j++) {
                cur = 0;
                for(int k =0; k!=s.length; k++){
                    s[k] +=m[j][k];
                    cur += s[k];
                    max = Math.max(max,cur);
                    cur = cur <0 ? 0 : cur;
                }
            }
          }

          return max;
     }

     public static void main(String[] args){

          int[][] a = new int[3][3];
          a[0][0]=-90;
          a[0][1]=-48;
          a[0][2]=78;
          a[1][0]=64;
          a[1][1]=-40;
          a[1][2]=64;
          a[2][0]=-81;
          a[2][1]=-7;
          a[2][2]=66;

          int x = maxSum(a);

          System.out.println(x);

     }

}

时间: 2024-11-05 15:17:38

算法总结之 子矩阵的最大累加和问题的相关文章

数组与矩阵---子矩阵的最大累加和问题

S88AI谕潜绰51http://www.docin.com/app/user/userinfo?userid=179005376 1迸0约第屠貉1MCThttp://huiyi.docin.com/uuyx68038 493F呐0x桃7H9释烦9http://weibo.com/p/1005056264981062 756N让翟JZ亿坷籽17少http://www.facebolw.com/space/2102405 190倒uk莆炒62屑酵粘6http://www.docin.com/app

【左神算法课】二维矩阵的子矩阵最大累加和

题目描述: 思路描述(请结合后面的程序配套理解): 代码: 1 /* 2 本程序说明: 3 4 给定一个矩阵matrix,其中有正有负有0,返回子矩阵的最大累加和 5 例如矩阵matrix为: 6 -90 48 78 7 64 -40 64 8 -81 -7 66 9 其中最大累加和的子矩阵为 10 48 78 11 -40 64 12 -7 66 13 14 */ 15 #include <iostream> 16 #include <vector> 17 using names

程序员代码面试指南 IT名企算法与数据结构题目最优解 ,左程云著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介  · · · · · ·这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化

算法期末考试练习题

一.选择题 1.算法分析中,记号O表示(B),记号?标售(A),记号Θ表示(D) A 渐进下界 B 渐进上界 C 非紧上界 D 紧渐进界 E 非紧下界 2.以下关于渐进记号的性质是正确的有:(A) A  f(n) =Θ(g(n)),g(n) =Θ(h(n)) ⇒f(n) =Θ(h(n)) B  f(n) =O(g(n)),g(n) =O(h(n)) ⇒h(n) =O(f(n)) C  O(f(n))+O(g(n)) = O(min{f(n),g(n)}) D  f(n) = O(g(n)) ⇔g

STL标准库-算法-常用算法

摘要: 摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each() for一段区间 做你指定的行为 3.replace(), replace_if(), replace_copy() 替换函数 4.count(), count_if() 计数 5.find() 查找 6.sort() 排序 7.binary_search()查看元素是否在

经典算法宝典——迭代思想(二)(1)

迭代法(Iteration)也称"辗转法",是一种不断用变量的旧值递推出新值的解决问题的方法. 说明: 迭代算法一般用于数值计算,比如累加.累乘都是迭代算法策略的基础应用. 利用迭代算法策略求解问题,设计工作主要有3步. (1)确定迭代模型 根据问题描述,分析得出前一个(或几个)值与其下一个值的迭代关系数学模型.当然这样的迭代关系,最终会迭代出求解的目标.确定迭代模型是解决迭代问题的关键. (2)建立迭代关系式 递推数学模型一般是带下标的字母,算法设计中要将其转化为"循环不变

Hark的数据结构与算法练习之计数排序

算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定性而做的数据累加,大家听我说说就知道了: 1.首先,先取出要排序数组的最大值,假如我们的数组是int[] arrayData = { 2, 4, 1, 5, 6, 7, 4, 65, 42 };,那么最大值就是65.(代码17-21行就是在查找最大值) 2.然后创建一个计数数组,计数数组的长度就是我

数组和矩阵

目录 1.打印矩阵 转圈打印矩阵 将正方形矩阵顺时针转动90度 “之”字形打印矩阵 2.数组的遍历查找 找到无序数组中最小的k个数(topk) 一个数组,所有数都出现了两次(三次),只有一个数出现了一次,返回这个数, 一个1-n的数,少了一个,找出来 在数组中找到出现次数大于N/K的数[删除不同的数] 在行列都排好序的矩阵中找数 奇数下标都是奇数或偶数下标都是偶数[even.odd变量变量] 在数组中找到一个局部最小的位置 边界都是1的最大正方形大小[遍历+动态规划] 不包含本位置值的累乘数组[

我在REST API应用网关负载均衡中加权轮循方法的实现

最近项目需要一个REST API应用网关,因此用GO写了一个,功能是在不断完善的,感觉最终功能跟nginx反向代理差不多的,除了业务处理.现在已经实现通过配置来控制转发行为.请求前端定义的地址A,通过认证后,转到后端指定地址B,并把结果返回. 现在增加支持多backend,因此要实现负载均衡. 大概网上看了下nginx源代码的算法,及其它网友的,基本上都是实时计算,最终落到backend的顺序,都是顺序的. 例如网友的例子: { a, b, c }三个服务器,weight值是{ 5, 1, 2