【动态规划】最大连续子序列和,最大子矩阵和,最大m子段和
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子段和的更多相关文章
- HDU 1081 To the Max 最大子矩阵(动态规划求最大连续子序列和)
		
Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...
 - hdu1231最大连续子序列(动态规划)
		
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
 - 动态规划:最大连续子序列乘积                                                    分类:            c/c++             算法             2014-09-30 17:03    656人阅读    评论(0)    收藏
		
题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划. 设data[i]:第i个数据,dp[i]:以第 ...
 - 动态规划(Dynamic Programming, DP)---- 最大连续子序列和
		
动态规划(Dynamic Programming, DP)是一种用来解决一类最优化问题的算法思想,简单来使,动态规划是将一个复杂的问题分解成若干个子问题,或者说若干个阶段,下一个阶段通过上一个阶段的结 ...
 - 九度OJ 1501 最大连续子序列乘积 -- 动态规划
		
题目地址:http://ac.jobdu.com/problem.php?pid=1501 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含 ...
 - 动态规划 HDU1231-------最大连续子序列
		
Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i < ...
 - HDU 1231 最大连续子序列 (动态规划)
		
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
 - UVa 108 - Maximum Sum(最大连续子序列)
		
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
 - dp经典问题-最大连续子序列和  hdu1003
		
题目描述: 这道题我先后做过三遍,结果每一遍都没有做出来.今天再仔仔细细的研究了一下,才发现用动态规划更好理解. 关于求最大连续子序列和的博文转载如下:https://www.cnblogs.com/ ...
 
随机推荐
- sql server替换字段中的某个字符
			
USE [Vocabulary ] GO --UPDATE [dbo].[table name] -- SET [en] = '' -- ,[cn] ='' -- WHERE --cha ...
 - 各大型网站架构分析收集-原网址http://blog.csdn.net/lovingprince/article/details/3379710
			
1. PlentyOfFish 网站架构学习http://www.dbanotes.net/arch/plentyoffish_arch.html 采取 Windows 技术路线的 Web 2.0 站 ...
 - NODE_ENV=production关于不同系统的写法
			
通过NODE_ENV可以来设置环境变量(默认值为development).一般我们通过检查这个值来分别对开发环境和生产环境下做不同的处理.可以在命令行中通过下面的方式设置这个值: linux & ...
 - zookeeper基本概念
			
1.集群角色 Leader,Follower,Observer Leader服务器是整个zookeeper集群工作机制中的核心 Follower服务器是zookeeper集群状态的跟随者 Observ ...
 - Beta 冲刺 (4/7)
			
Beta 冲刺 (4/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 准备四六级 展示GitHub当日代码/ ...
 - Linux3.10.0块IO子系统流程(6)-- 派发SCSI命令到低层驱动
			
在SCSI策略例程中最后调用scsi_dispatch_cmd将SCSI命令描述符派发给低层驱动进行处理 /** * scsi_dispatch_command - Dispatch a comman ...
 - n阶楼梯,一次走1,2,3步,求多少种不同走法
			
##已知n阶楼梯,一次可以迈1,2,3步.求所有走法## 如果要列出走法,时间复杂度太高,O(n)=2**n,前两个函数遍历走法.## 如果只是单纯列出走法数量,就简单多了,也但是很容易内存爆表. # ...
 - inventory file 与hosts patterns (ansible 机器清单 与 主机匹配模式)
			
Ansible配置: ansible有两个核心配置文件: ansible.cfg 配置文件和Inventory配置文件 Ansible.cfg配置文件 Inventory机器列表配置 这里介绍Inve ...
 - GeoServer java.io.IOException: No such resource: generic.sld No such resource: generic.sld
			
原因是 发布 图层时 没有设置类型 默认 generic 但是我们的数据库中 没有这个 解决办法: 点击 图层--点击 相应的 图层名称 ---发布 --- WMS Settings 下面的Defa ...
 - 2/19 学习笔记(for in 、 del语句)
			
for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句 del语句作用在变量上,而不是数据对象上 列表可以修改,而字符串和元组不能