给定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;}

动态规划--连续子序列的最大和相关推荐

  1. 【Py面试题】找到数组或整数列表中连续子序列的最大和

    测试面试题 找到数组或整数列表中连续子序列的最大和 找到数组或整数列表中连续子序列的最大和,并满足以下条件: 列表仅由正数组成并且最大和是整个数组的总和. 如果列表仅由负数组成,则返回 0 空列表被认 ...

  2. 分治算法-01连续子序列的最大和问题

    连续子序列的最大和 前言 分治算法的核心思想是将一个规模很大的问题化简为n个规模较小的问题,这些子问题虽然独立而不同,但是问题的本质是一致的,从而达到分而治之的目的. 首先通过"分" ...

  3. 求数组非连续子序列的最大和

    题目描述: 1. 一个整数数组L,如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和.这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻.例如, ...

  4. 最大子序列求和_连续子序列最大和与乘积问题的分析

    问题描述 给定(可能是负的)整数序列A1, A2,...,AN, 寻找(并标识)使Sum(Ak)(k >=i, k <= j)的值最大的序列.如果所有的整数都是负的,那么连续子序列的最大和 ...

  5. 最大连续子序列和-动态规划

    题目描述: 给定K个整数的序列{ N1, N2, -, NK },其任意连续子序列可表示为{ Ni, Ni+1, -, Nj },其中 1 <= i <= j <= K.最大连续子序 ...

  6. 动态规划经典题目——最大连续子序列之和

    一.题目 给定K个整数的序列{ N1, N2, -, NK },其任意连续子序列可表示为{ Ni, Ni+1, -, Nj },其中 1 <= i <= j <= K.最大连续子序列 ...

  7. 最大连续子序列和:动态规划经典题目

    [题目] 给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列 ...

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

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

  9. Maximum Sum UVA - 108(连续子序列最大和—变形之子矩阵最大和)

    题目大意:给出 n*n 的矩阵,找每隔数字之和最大的子矩阵,输出最大和.  解题思路:枚举矩阵左上和右下的坐标,分别合并子矩阵的每列,使得二维转化为一维,然后利用连续子序列最大和去做就行. Time ...

最新文章

  1. 景驰科技又生闹剧?法人代表潘思宁将CFO吕庆诉至法院
  2. 字节跳动---万万没想到之抓捕孔连顺
  3. 树的同构模板题(法1.最小表示法+法2.树哈希)
  4. 【Python 标准库学习】时间相关的函数库 — time
  5. linux基础:7、基础命令介绍(2)
  6. Flex4之皮肤定制
  7. 都客音量调节助手v2.1(win7专用)发布了
  8. 股票休市午间可以撤单吗?
  9. jQuery 学习笔记 事件委派
  10. 25 种代码坏味道总结+优化示例
  11. 如何自己实现一个缓存服务
  12. C# tcpClient发送和接收
  13. CentOS Steam 9 安装测试
  14. 7-14 然后是几点 (15 分)有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
  15. javascript html 去除,javascript去除html标签
  16. 关键应用在超融合环境下的实践
  17. HIVE:窗口函数,用sql语句查询MySQL安装路径和版本
  18. 谷歌研究总监Peter Norvig赴斯坦福任教,著有《人工智能:一种现代方法》
  19. GameFramework篇:StarForce资源热更新讲解(二:具体操作步骤)
  20. 重新启动网卡时出错: failed because the control process exited with error code.

热门文章

  1. ESP32 flash容量配置
  2. apache2启动和停止操作
  3. Win10安装Maven并更换阿里源
  4. PKI/CA (6)双证书
  5. (chap6 Http首部) 为Cookie服务的首部字段
  6. 操作系统课设--扩展文件系统
  7. 16-Understanding the Armv8.x extensions
  8. 05-CA/TA编程:hmac demo
  9. aarch64的TCR寄存器介绍
  10. [ARM异常]-同步异常产生和返回(svc/hyc/smc/eret)