1.最大字段和问题

求一个序列最大连续子序列之和。

例如序列[-1,-2,-3,4,5,-6]的最大子段和为4 + 5 = 9。

①枚举法

int MaxSum(int n,int *a){
int sum = -0x3f3f3f3f;
for(int i=;i<n;i++){
int b = ;
for(int j=i;j<n;j++){
b += a[j];
sum = b > sum ? b : sum;
}
}
return sum;
}

②动态规划

解题思路:

第一步:设b[ j ] 为 1到 j 的最大连续子序列之和。

第二步:因为b[ j ] 为以a[ j ]结尾的最大连续子序列之和,因此有两种可能

  1.b[ j ] = a[ j ]

  2.b[ j ] = b[ j - 1 ] + a[ j ]

因此我们可以得到递推方程,

b[ j ] = max{ a[ j ], b[ j  - 1] + a[ j ] } = max { 0 , b[ j - 1 ]} + a[ j ]

int MaxSum(int n,int *a){
int sum = -0x3f3f3f3f, b = ;
for(int i=; i<n; i++){
if(b>=)
b+=a[i];
else
b=a[i];
if(b>sum)
sum = b;
}
return sum;
}

2.引申:两个连续序列的最大字段和问题

求两个等长的序列的最大重叠连续子序列之和

例,第一个序列为[-1,-2,-3,4,5,-6],第二个序列为[1,2,4,4,5,-6],则 MAX = ( 4 + 5) + (4 + 5) = 19

2与1的区别在于,原本只有一个序列,现在变成两个,但是求的是最大重叠连序列之和,所以可以将两个序列加起来变成一个序列。

①枚举法

②动态规划

解题思路:

设b[ j ] 为 1到 j 的最大重叠连续子序列之和。

若b[ j - 1 ] >= 0 ,

  则 b[ j ] = b [ j - 1 ] + a[ 0 ][ j ] +  a[ 1 ][ j ];

  否则 b[ j ] = a[ 0 ][ j ] +  a[ 1 ][ j ]

int MaxSum(int n,int (*a)[]){
int sum = -0x3f3f3f3f, b = ;
for(int i=; i<n; i++){
if(b>=){
b+=a[][i];
b+=a[][i];
}
else{
b=a[][i];
b+=a[][i];
}
if(b>sum)
sum = b;
}
return sum;
}

3.最大子矩阵之和

给定矩阵A,求其子矩阵各元素之和的最值

若将矩阵的行看作是一个个的连续序列,则与2问题不同的是,

  第一,可能不只一个连续序列(矩阵的行)相加,

  第二,需要枚举子矩阵的初始行R0,和结束行R1

①枚举法

②动态规划

//求 r0行到r1行 第i列元素的和
int sum_r(int r0, int r1, int i){
int sum = ;
for(int r=r0;r<=r1;r++)
sum += a[r][i];
return sum;
}
//求最大子矩阵和
int MaxSum(){
int sum = -0x3f3f3f3f;
for(int r0=;r0<m;r0++){//枚举初始行
for(int r1=r0;r1<m;r1++){//枚举结束行
int b = ;
for(int i=; i<n; i++){//这个循环使用问题1中的算法
if(b>=)
b+=sum_r(r0,r1,i);//第r0行到第r1行 第i列元素和
else
b=sum_r(r0,r1,i); sum = sum > b? sum : b;
}
}
}
return sum;
}

我们能够注意到,上面的程序,需要我们写一个计算第r0行到第r1行第i列的元素和的函数sum_r( ),但是我们需要频繁调用这个函数,可以用一个数组来记录计算结果,这一步可以在我们读入数据的时候进行。

专门建立一个二维数组,col [ i ][ j ],记录第 i 列,前 j 个元素的和。

所以,MaxSum函数中,b += sum_r(r0, r1, i ),可以替换成

b += col[ i ][ r1 ] - col[ i ][ r0 - 1 ]

最终代码

int MaxSum(){
int sum = -0x3f3f3f3f;
for(int r0=;r0<m;r0++){
for(int r1=r0;r1<m;r1++){
int b = ;
for(int i=; i<n; i++){
if(b>=)
b+=col[i][r1] - col[i][r0 - ];
else
b=col[i][r1] - col[i][r0 - ]; sum = sum > b? sum : b;
}
}
}
return sum;
}

 4.最大m字段和问题

【动态规划】最大连续子序列和,最大子矩阵和,最大m子段和的更多相关文章

  1. HDU 1081 To the Max 最大子矩阵(动态规划求最大连续子序列和)

    Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...

  2. hdu1231最大连续子序列(动态规划)

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  3. 动态规划:最大连续子序列乘积 分类: c/c++ 算法 2014-09-30 17:03 656人阅读 评论(0) 收藏

    题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划. 设data[i]:第i个数据,dp[i]:以第 ...

  4. 动态规划(Dynamic Programming, DP)---- 最大连续子序列和

    动态规划(Dynamic Programming, DP)是一种用来解决一类最优化问题的算法思想,简单来使,动态规划是将一个复杂的问题分解成若干个子问题,或者说若干个阶段,下一个阶段通过上一个阶段的结 ...

  5. 九度OJ 1501 最大连续子序列乘积 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1501 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含 ...

  6. 动态规划 HDU1231-------最大连续子序列

    Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i < ...

  7. HDU 1231 最大连续子序列 (动态规划)

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  8. UVa 108 - Maximum Sum(最大连续子序列)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  9. dp经典问题-最大连续子序列和 hdu1003

    题目描述: 这道题我先后做过三遍,结果每一遍都没有做出来.今天再仔仔细细的研究了一下,才发现用动态规划更好理解. 关于求最大连续子序列和的博文转载如下:https://www.cnblogs.com/ ...

随机推荐

  1. 2019清明期间qbxt培训qwq

    4.4上午:数学基础 (qwq整成word和cpp了,它居然不能直接把文档附上来) part 1:高精度运算 高精加和高精减就不说了,之前写过博客了qwq,讲一讲高精乘和高精除吧. 1.高精度乘法(不 ...

  2. leetcode-956. 最高的广告牌

    https://leetcode-cn.com/contest/weekly-contest-114/problems/tallest-billboard/ 给出一个集合,询问能否挑出两个不重叠的子集 ...

  3. django1

    * <pre>━━━━━━神兽出没━━━━━━ * ┏┓ ┏┓ * ┏┛┻━━━┛┻┓ * ┃ 王 ┃ * ┃   ┃ * ┃ ┳┛ ┗┳ ┃ * ┃ ┃ * ┃ ┻ ┃ * ┃ ┃ * ...

  4. 2010-10-08在浏览器中兼容+jQuery3

    一.实现背景图片铺满(兼容各种浏览器) <script type="text/javascript"> $(document).ready(function() { $ ...

  5. js对象的深拷贝

    关于对象的深拷贝一直是大家津津乐道一个话题,本骚年通过研究(yuedu)发现还是很easy的. 首推的方法简单有效,JSON.stringfy()和JSON.parse()即可搞定.但是这种简单粗暴的 ...

  6. with&as上下文管理协议

    通过with 方式调用的方式 class Open: def __init__(self,name): self.name = name def __enter__(self): #with调用的时候 ...

  7. 生成器yield

    #!/usr/bin/python#coding=utf-8'''Created on 2017年11月23日 from home @author: James zhan ''' def counte ...

  8. eclipse工具类及插件(设置注释模板)

    (摘抄原地址)https://blog.csdn.net/xb12369/article/details/79850476(设置注释模板) 首先打开Eclipse配置选项:Window->Pre ...

  9. 18-10-09 Linux常用命令大全(非常全!!!)

     Linux常用命令大全(非常全!!!)   Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制, ...

  10. ela的UNASSIGNED索引修复

    1.查找UNASSIGNED未分片的索引: #curl -s "http://localhost:9200/_cat/shards" -u username:passwd | gr ...