`
chriszeng87
  • 浏览: 738314 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用动态规划求连续数组最大和以及最大子矩阵的和

阅读更多

题目一:

给定一个整型数组,数组中有正有负,求最大连续子序列的和。

 

解法:

利用动态规划的思想。

设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)。

 

转自:http://blog.csdn.net/yahohi/article/details/7958261

分享到:
评论

相关推荐

    最大子矩阵和.docx

    给定一个数组`a[1..n]`,目标是找到数组的一个连续子段,使得该子段的元素之和最大。这个问题可以通过动态规划的方法解决,递推公式为: \[ b[j] = \max\{b[j-1] + a[j], a[j]\} \] 其中`b[j]`表示从索引0到j的...

    最大子矩阵应用场景介绍.zip

    最大子矩阵问题是指给定一个MxN的矩阵,找出其中连续的子矩阵(即由矩阵中的一些行和列组成的小矩阵),使得这个子矩阵的所有元素之和最大。这里的连续指的是子矩阵的行和列都是连续的,不能跳跃选择。 二、算法...

    最大子矩阵概述.pdf

    **最大子矩阵问题**是指在给定的一个二维矩阵中寻找一个连续子矩阵,使得该子矩阵的元素和达到最大值。这一问题源自于经典的**最大子数组问题**,即在一维数组中寻找具有最大和的连续子数组。最大子矩阵问题由于其多...

    动态规划之最大字段和问题

    这个问题通常涉及到在一个二维数组或矩阵中找到一个子矩阵,其所有元素的和最大。 动态规划的核心在于将复杂问题分解为更小的子问题,并利用这些子问题的解来构建原问题的解。对于最大字段和问题,我们可以使用二维...

    8601最大长方体问题

    任务是找到这个长方体中最大的子长方体(即连续的小立方体集合),其内部所有整数之和最大。如果所有元素都是负数,则输出最大子长方体的大小为0。 这个问题可以逐步从一维扩展到三维来解决: 1. **一维最大字段和...

    最大子矩阵(信息学奥赛一本通-T1282).rar

    Kadane's Algorithm 原本是用于求一维数组中连续子数组的最大和,但通过适当修改,可以应用于二维矩阵的情况。 在实际编程实现时,需要注意内存效率,因为矩阵可能非常大,所以避免不必要的计算和存储。此外,对于...

    二维数组前缀和 前缀和 课程zb

    对于一个一维数组,前缀和是指数组中连续子数组的和,例如,对于数组a[1...n],前缀和数组preSum[i]表示a[1...i]的和。二维数组前缀和是这个概念的扩展,它计算的是矩阵中所有左上角为(s1, s2)、右下角为(e1, e2)的...

    3、动态规划必练题(含解法).pdf

    寻找数组中的连续子数组,使得其和最大。可以使用Kadane's algorithm,动态规划思路是维护当前子数组的和`curr_sum`和全局最大和`max_sum`。 6. **Maximum Product Subarray** (最大乘积子数组) 类似于最大子数组...

    python实现最大子序和(分治+动态规划)

    遍历法的核心思想是利用动态规划的思想,但仅维护一个当前子数组的和 `onesum` 和最大和 `maxsum`。 **算法过程** 1. 初始化 `onesum = 0` 和 `maxsum = nums[0]`。 2. 遍历数组 `nums`,对于每个元素 `nums[i]`: ...

    最大长方体问题

    在计算机科学与算法领域,最大子数组(或子矩阵、子长方体)问题是寻找一个多维数组中的一个连续子区域,使得该子区域内的元素之和最大。本问题讨论的是一个三维的情况——最大子长方体问题。具体来说,给定一个长、...

    分治法解快速排序,对称搜索及最大字段和

    最大字段和问题,通常指的是在一个二维数组中找出具有最大和的连续子矩阵。这个问题可以通过动态规划和 Kadane's Algorithm 的变形来解决。首先,我们需要计算每一行的最大和,然后对于每一列,我们计算以该列为底的...

    算法导论上机报告 算法

    这个问题旨在找到一个数组中的连续子序列,使得其和最大。通过遍历数组,我们可以跟踪到目前为止遇到的最大和以及当前连续子序列的和,从而找到全局的最大子序列和。这个算法在解决实际问题如股票投资策略、赌博游戏...

    2022年第十三届蓝桥杯省赛 C/C++ B组 真题

    - 可能涉及到矩阵操作和动态规划。题目可能要求计算矩阵中满足特定条件的子矩阵数量或者特性。C++中,可以使用二维数组来表示矩阵,并应用迭代或递归算法来查找符合条件的子矩阵。 7. **积木画**(未提供具体内容...

    ACM常用模板及北大ACM-题型分类代码

    - **定义**: 给定一个二维数组,求所有子矩阵的和的最大值。 - **应用场景**: 在图像处理、数据分析等领域。 - **实现方法**: - 可以通过预处理的方法来优化计算。 #### 最小顶点割集 - **定义**: 找出从源点到...

    matlab 矩阵数组 矩阵元素的引用 算法开发、数据可视化、数据分析以及数值计算 Matlab课程 教程 进阶 资源

    你可以执行加法、减法、乘法(点乘和常规乘)、除法等基本操作,以及求幂、开方、对数等数学函数。例如: ```matlab B = [1 2; 3 4]; C = [5 6; 7 8]; D = B + C; % 加法 E = B .* C; % 点乘 F = B / C; % 除法 ```...

    计软实验三:分治算法1

    然后比较1, 2, 1 和 2,取和最大的作为整个数组的最大子数组。这个过程可以递归进行,直到数组不能再分割。 2. **矩阵乘法的斯特拉斯根算法**:生成不同尺寸(50, 100, 200, 500, 1000)的随机整数矩阵和,使用朴素...

    dp总结文件

    给定一个整数序列,找出其中连续且非空的一段子序列,使得该子序列的和最大。 #### 解法 - **暴力枚举法**:枚举所有可能的子序列,计算它们的和,并记录最大的和。时间复杂度为 O(n^2)。 - **前缀和优化法**:使用...

    百度面试题大收集算法

    5. **01矩阵求最大子矩阵**: 这是一道经典的二维数组处理问题,可以应用Kadane's algorithm进行解决,寻找连续子数组的最大和。对于01矩阵,目标是找到连续的1的最大数量。 6. **判断点分十进制IP合法性**: IP...

Global site tag (gtag.js) - Google Analytics