动态规划--连续子序列的最大和
给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k。最大连续子序列是所有连续子序中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20。
注:为方便起见,如果所有整数均为负数,则最大子序列和为0。
算法一,穷举法,找出所有子数组,然后求出子数组的和,在所有子数组的和中取最大值
/*O(n^3)穷举法* 缺点:重复累加,与maxSum比较,每次i->j中间累加完了才与maxSum比较* */public static int MaxSubSequence1(int[] array){int length=array.length;int maxSum=0;int thisSum=0;for(int i=0;i<length;i++){for(int j=i;j<length;j++){thisSum=0;for(int k=i;k<j;k++){//把i->j之间累加起来thisSum+=array[k];if(thisSum>maxSum){maxSum=thisSum;}}}}return maxSum; }
算法二,第一种方法每次i->j之间都要迭代一遍,重复计算了很多,可以利用已经计算的子数组的和
/*O(n^2)穷举法* i->j之间每累加一次就和maxsum比较* */public static int MaxSubSequence2(int[] array){int length=array.length;int maxSum=0;int thisSum=0;for(int i=0;i<length;i++){thisSum=0;for(int j=i;j<length;j++){thisSum+=array[j]; if(thisSum>maxSum){maxSum=thisSum;}}}return maxSum;}
算法三,动态规划,初始化一个最大值数组MaxSum[n], MaxSum[i]就表示A[0...i]以A[i]结尾的子数组最大和,那么MaxSum[i]就等于A[0...i-1]的最大和加上A[i]在和A[i]比较求最大值, MaxSum[i] = Max{ MaxSum[i-1] + A[i], A[i]}
//动态规划,状态方程 MaxSum[i] = Max{ MaxSum[i-1] + A[i], A[i]};MaxSum[i]表示已a[i]结尾的最大和public static int MaxSubSequence3(int[] array){int length=array.length;int[] MaxSum=new int[length];MaxSum[0]=array[0];for(int i=1;i<length;i++){MaxSum[i]=Math.max(MaxSum[i-1]+array[i], array[i]);}//找到MaxSum中的最大值int maxSum=Integer.MIN_VALUE;for(int i=0;i<MaxSum.length;i++){if(MaxSum[i]>maxSum){maxSum=MaxSum[i];}}return maxSum;}
算法三的改进O(n)
/** 方法三的简化,当前面的累加和thisSum小于0是就置0,丢弃,大于maxSum时,把值赋给maxSum* */public static int MaxSubSequence4(int[] array){int length=array.length;int maxSum=0;int thisSum=0;for(int i=0;i<length;i++){thisSum+=array[i];if(thisSum>maxSum){maxSum=thisSum;}else if(thisSum<0){thisSum=0;}} return maxSum;}
动态规划--连续子序列的最大和相关推荐
- 【Py面试题】找到数组或整数列表中连续子序列的最大和
测试面试题 找到数组或整数列表中连续子序列的最大和 找到数组或整数列表中连续子序列的最大和,并满足以下条件: 列表仅由正数组成并且最大和是整个数组的总和. 如果列表仅由负数组成,则返回 0 空列表被认 ...
- 分治算法-01连续子序列的最大和问题
连续子序列的最大和 前言 分治算法的核心思想是将一个规模很大的问题化简为n个规模较小的问题,这些子问题虽然独立而不同,但是问题的本质是一致的,从而达到分而治之的目的. 首先通过"分" ...
- 求数组非连续子序列的最大和
题目描述: 1. 一个整数数组L,如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和.这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻.例如, ...
- 最大子序列求和_连续子序列最大和与乘积问题的分析
问题描述 给定(可能是负的)整数序列A1, A2,...,AN, 寻找(并标识)使Sum(Ak)(k >=i, k <= j)的值最大的序列.如果所有的整数都是负的,那么连续子序列的最大和 ...
- 最大连续子序列和-动态规划
题目描述: 给定K个整数的序列{ N1, N2, -, NK },其任意连续子序列可表示为{ Ni, Ni+1, -, Nj },其中 1 <= i <= j <= K.最大连续子序 ...
- 动态规划经典题目——最大连续子序列之和
一.题目 给定K个整数的序列{ N1, N2, -, NK },其任意连续子序列可表示为{ Ni, Ni+1, -, Nj },其中 1 <= i <= j <= K.最大连续子序列 ...
- 最大连续子序列和:动态规划经典题目
[题目] 给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列 ...
- 动态规划 HDU1231-------最大连续子序列
Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i < ...
- Maximum Sum UVA - 108(连续子序列最大和—变形之子矩阵最大和)
题目大意:给出 n*n 的矩阵,找每隔数字之和最大的子矩阵,输出最大和. 解题思路:枚举矩阵左上和右下的坐标,分别合并子矩阵的每列,使得二维转化为一维,然后利用连续子序列最大和去做就行. Time ...
最新文章
- 景驰科技又生闹剧?法人代表潘思宁将CFO吕庆诉至法院
- 字节跳动---万万没想到之抓捕孔连顺
- 树的同构模板题(法1.最小表示法+法2.树哈希)
- 【Python 标准库学习】时间相关的函数库 — time
- linux基础:7、基础命令介绍(2)
- Flex4之皮肤定制
- 都客音量调节助手v2.1(win7专用)发布了
- 股票休市午间可以撤单吗?
- jQuery 学习笔记 事件委派
- 25 种代码坏味道总结+优化示例
- 如何自己实现一个缓存服务
- C# tcpClient发送和接收
- CentOS Steam 9 安装测试
- 7-14 然后是几点 (15 分)有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
- javascript html 去除,javascript去除html标签
- 关键应用在超融合环境下的实践
- HIVE:窗口函数,用sql语句查询MySQL安装路径和版本
- 谷歌研究总监Peter Norvig赴斯坦福任教,著有《人工智能:一种现代方法》
- GameFramework篇:StarForce资源热更新讲解(二:具体操作步骤)
- 重新启动网卡时出错: failed because the control process exited with error code.