利用动态规划求连续数组最大和以及最大子矩阵的和
题目一:
给定一个整型数组,数组中有正有负,求最大连续子序列的和。
解法:
利用动态规划的思想。
设f(n)表示以a[n]为子序列最后一个元素的最大和,则可以有下面的规则:
(1)当f(n-1)<0时,f(n)=a[n];
(2)当n!=0且f(n-1)>0时,f(n)=f(n-1)+a[n]。
用一个nGreatestNum来记录最大值,每次与f(n)进行比较,不断更新即可。
题目二:
给定一个二维数组,数组中有正有负,求最大子矩阵的和。
解法:
仍然用动态规划的思想。
首先,将二维问题降维处理:
例如,用2 维数组a[1 : m][1 : n]表示给定的m行n列的整数矩阵。子数组a[i1 : i2][j1 : j2]表示左上角和右下角行列坐标分别为(i1, j1)和(i2, j2)的子矩阵。
先按照行排列出所有可能区间,然后,再去求列的范围。
更详细的,当行区间确定之后,剩下就是确定列区间了,一旦确定列区间,最大子矩阵就确定了。
当行区间确定之后,求列区间的方法,可以转化成一维数组的最大连续子序列的问题:对行区间[i1, j1],依次对列进行求和,就得到n个数据的以为数组,根据最大连续子序列的和的求法,就可以获得连续子序列最大和。
仍然用nGreatestNum来记录最大值,算出一个子矩阵的和,就进行比较即可。
复杂度分析:
(1)排列出行区间,复杂度为O(M*M);
(2)而求得最大子序列的和复杂度为O(N);
(3)对于行区间确定之后对列求和的复杂度呢?
这里采用“部分和”的做法。
用BC[i][j]表示0到i行、0到j列的总和。
那么对于行区间r->l,求第i列的和:BC[l][i] - B[r-1][i] - B[l][i-1] + B[r-1][i-1]。
而求“部分和”仅需要O(N*M)。可以预先计算好。
因此,算法复杂度为O(N*M*M)。
版权声明:本文为博主原创文章,未经博主允许不得转载。
转载于:https://www.cnblogs.com/wangicter/archive/2012/09/08/4767293.html
利用动态规划求连续数组最大和以及最大子矩阵的和相关推荐
- Maximum Sum UVA - 108(连续子序列最大和—变形之子矩阵最大和)
题目大意:给出 n*n 的矩阵,找每隔数字之和最大的子矩阵,输出最大和. 解题思路:枚举矩阵左上和右下的坐标,分别合并子矩阵的每列,使得二维转化为一维,然后利用连续子序列最大和去做就行. Time ...
- 动态规划之如何将问题抽象转化为0-1背包问题(详解利用动态规划求方案数)
⭐️前面的话⭐️ 本篇文章介绍如何对问题抽象转化成0-1背包问题求解和运用0-1背包求方案数.
- N 组连续子串最大和
数组 a 中有 M 个数 , 将 M 个数分成 N 组 , 并且每组中的数据顺序和原数组中的顺序保持一致,求 N 组中的数据之和最大为多少? 向 dp 数组中赋初始值 ,如果 M == N ,则 dp ...
- php取数组中连续数,PHP实现求连续子数组最大和问题2种解决方法
本文实例讲述了PHP实现求连续子数组最大和问题2种解决方法.分享给大家供大家参考,具体如下: 问题描述 求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整 ...
- 《团队开发一(求一个数组的连续的子数组之和的最大值)》
<团队开发一(求一个数组的连续的子数组之和的最大值)> (1)设计思想:一般的,求一个数组的最大子数组之和即是按数组顺序依次让前几个数的和与下一个数进行比较,设一变量来装每次比较后的较大的 ...
- java 最大子数组_求一个数组中子数组的最大和算法(Java实现)
前几天在微信订阅号"待字闺中"中看到的一篇文章<小技巧求一个数组中子数组的最大和>,提供下Java的实现,并且在对题目做下小修改,本来打算直接在微信里直接回复,但是发现 ...
- 动态规划:连续子数组的最大和
解答过程: 使用动态规划 F(i):以array[i]为末尾元素的子数组的和的最大值,子数组的元素的相对位置不变 F(i)=max(F(i-1)+array[i] , array[i]) res:所有 ...
- 结对开发项目:求整数数组中连续子数组和的最大值
小组成员:安娜 王鑫楠 题目二:求整数数组中连续子数组和的最大值. 1.分析过程: 题目收到后,前五分钟设计算法,首先也想到是不是一次遍历可以解决,考虑了一下觉得难度有点大最后还是果断放弃.我刚开始的 ...
- 利用函数求数组中的最大值
利用函数求数组中的最大值 <!DOCTYPE html> <html lang="en"><head><meta charset=&quo ...
最新文章
- linux shell脚本中调用另一个shell脚本
- 服务器无限火力时间,LOL无限火力2018时间表6月具体开启时间 无限火力模式什么时候出...
- 《BI那点儿事》三国人物智力分布状态分析
- 从一个提问引发到你是怎么看待编程语言是一种工具这句话的?【笔记自用】
- c# 数组中的空值_译 | 你到底有多精通 C# ?
- linux 硬盘繁忙,icinga2 借助check_iostat.sh抓取linux服务器的diskIO(硬盘繁忙度)
- Easyui Tree 异步加载实例
- 从读写角度,带你了解数仓的IO基本框架
- 若依集成ueditor富文本编辑器
- 关于YOLOv3的文章
- python 爬虫_python爬虫技术汇总
- 用汉明距离进行图片相似度检测的Java实现
- 计算机导论中如何求模,计算机导论作业答案
- 使用Python实现通过doi下载文献pdf
- 小葵花妈妈课堂之nginx必须要了解的优化九部曲!
- C语言:从低位开始取出长整型变量s奇数位上的数,依次构成一个新数放在t中。
- 3d建模网上学习靠谱吗?学3d建模哪个学校好?
- Linux tar/rpm/yum命令软件安装
- 删除dataframe中的某行 删除不掉是为啥
- Oracle Livelabs实验: Setting Up Active Data Guard For On-Premises