首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题。这个问题无疑就是把原问题扩展到二维的情况。

      想起来这个问题也不是很难,我们可以求解一维矩阵的思想,即我们可以固定住行(或列),之后,我们去求解列(或行)所构成的最大和就可以了。

这里的解法利用的是固定住行,然后求解需要寻找的列之和,利用书中提到的一个公式:

以左上角的元素(1,1)和当前元素(i,j)为顶点对的子矩阵的部分和,部分和的计算如下

PS[i][j] = A[i][j]+PS[i-1][j]+PS[i][j-1]-PS[i-1][j-1]

由此,我们很容易可以得到下面的解答:

函数声明:

/*2.15 二维数组最大子数组的和(数组下标从(1,1)开始)*/
int DutPartialSum(int**, int, int, int);
int DutMaxSubMatrixInTwoDimensionArray(int**, int, int);

源代码:

bool _DutPartialSum = false;
int DutPartialSum(int** p, int i, int j, int k)
{if (!p || i <= 0 || j <= 0 || k <= 0){_DutPartialSum = true;return -1;}return p[j][k] - p[j][k - 1] - p[i - 1][k] + p[i - 1][k - 1];
}bool _DutMaxSubMatrixInTwoDimensionArray = false;
int DutMaxSubMatrixInTwoDimensionArray(int** A, int n, int m)
{if (!A || n <= 0 || m <= 0){_DutMaxSubMatrixInTwoDimensionArray = true;return -1;}int **p = new int* [n + 1];for (int i = 0; i <= n; ++i)p[i] = new int[m];for (int i = 0; i <= n; ++i)p[i][0] = 0;for (int i = 0; i <= m; ++i)p[0][i] = 0;for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j)p[i][j] = p[i - 1][j] + p[i][j - 1] - p[i - 1][j - 1] + A[i][j];int maxSum = 1 << 31;for (int i = 1; i <= n; ++i){for (int j = i; j <= n; ++j){int start = DutPartialSum(p, i, j, m);int all = DutPartialSum(p, i, j, m);for (int k = m - 1; k >= 1; --k){if (start <= 0)start = DutPartialSum(p, i, j, k);elsestart += DutPartialSum(p, i, j, k);if (start > all)all = start;}if (all > maxSum)maxSum = all;}}return maxSum;
}

编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)相关推荐

  1. 编程之美2.10:寻找数组中的最大值和最小值

    编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...

  2. 编程之美2.1 求二进制中1的个数

    最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...

  3. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...

  4. pyhton GUI编程之Tkinter详细讲解二

    文章目录 Tkinter详细讲解 pyhton GUI编程之Tkinter详细讲解二 4. 组件用法 4.1 文本输入和输出相关控件 4.1.1 Lable标签 4.1.2 Message消息 4.1 ...

  5. 用STM32实现:摄像头扫到二维码后提取二维码中的信息分别放到数组中

    摄像头扫到二维码后提取二维码中的信息分别放到数组中 把想要的信息编辑好放到二维码中(网上有好多在线生成二维码的工具) /** *作者:魏波 *时间:2017.6.6 * **/char name[6] ...

  6. php二维数组排序 按照指定的key 对数组进行排序

    2019独角兽企业重金招聘Python工程师标准>>> /*** @desc arraySort php二维数组排序 按照指定的key 对数组进行排序* @param array $ ...

  7. 用ThoughtWorks.QRCode生成二维码时出现“索引超出了数组界限”的错误

    用ThoughtWorks.QRCode生成二维码时出现"索引超出了数组界限"的错误 字符串较长的情况下,用ThoughtWorks.QRCode生成二维码时出现"索引超 ...

  8. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  9. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

最新文章

  1. LeetCode简单题之寻找数组的中心下标
  2. R Learnilng 十八讲1-6
  3. linux 物理内存 分配,[linux物理内存分配]Linux系统下如何查看物理内存占用率
  4. linux oracle path恢复,Linux 环境下Oracle安装与调试(七)之SQL Loader,备份和恢复
  5. 微软云计算介绍与实践(实践之十七)
  6. C++|STL学习笔记-对STL中关联容器map的进一步认识
  7. 解决ipad,ios录屏保存失败-5823
  8. vmware vcenter orchestrator configuration提示“用户名密码错误或登录失败超过次数被锁定”...
  9. 沈向洋离开微软,曾是华人在美科技圈最高级高管,畅谈职业生涯的 7 堂课!...
  10. centos7-修改主机名
  11. 字节码指令之控制转移指令
  12. Clover_v2.3k版本合集 四叶草EFI文件、Pkg安装包
  13. 浅析百度搜索引擎白皮书
  14. 如何判断一个数是否为素数(质数)?
  15. 2019南昌市计算机教师招聘,南昌经济技术开发区2019年招聘教师拟聘用人员名单...
  16. 吴晓波:拼多多的新与旧
  17. VPN --- (虚拟专用网) 详解
  18. qlv转php,如何将qlv文件转换成mp,qlv文件怎么免费转换为mp4格式
  19. MacOS安装npm
  20. 数据分析师发展前景怎么样?

热门文章

  1. MySQL的恢复脚本
  2. 使用 Android Studio 进行测试 (二) UI 测试
  3. 深入Java虚拟机——类型装载、连接(转)
  4. Android Custom View系列《圆形菜单一》
  5. 为什么白帽SEO更好?
  6. 在vs2005中使用loki的方法
  7. python_restframework(频率组件)
  8. Spring DAO之Hibernate
  9. APDU命令的结构和处理【转】
  10. C++在构造函数中调用构造函数