zoukankan      html  css  js  c++  java
  • 求最大子数组问题

    问题:

    给定一个整数序列A,序列中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

    解法:

    第一种:

    暴力枚举所有的子数组,然后比较选出最大,时间复杂度O(n^2)

    第二种:

    分治法,参见算法导论,时间复杂度O(nlogn)

    第三种:

    动态规划,时间复杂度O(n)

    1、第一层动态规划:最大子数组由于是连续的,所以肯定有一个起点和一个终点,可以考虑起点终点落下的位置,如A[1..j+1]中,起点终点可以同时落入A[1,j]中,也可以终点始终在A[j+1],起点落在A[1..j]中。最终得到A[1..j+1]的最大子数组为:max{A[1..j] , A[i,j+1](1<=i<=j+1)的最大值},用max记录A[1..j]

    2、第二层动态规划:A[i,j+1](1<=i<=j+1)的最大值就是以A[j+1]结尾的最大子数组。设K[j+1]为以A[j+1]结尾的最大子数组,考虑K[j]与K[j+1]之间的关系,以A[j+1]结尾的最大子数组肯定包含A[j+1],所以只需考虑是否包含其前面的K[j],如果K[j]>0则会包含。最终得到K[j+1]=K[j]>0?A[j+1]+K[j]:A[j+1],用tmp记录K[j]

  • 相关阅读:
    团队项目-选题报告
    图论3-分层图最短路
    图论2-次短路计数
    图论1-k短路
    noi online 提高组t2冒泡排序
    图和树
    搜索(bfs)
    搜索(dfs)
    笔记
    打工
  • 原文地址:https://www.cnblogs.com/littlebugfish/p/4321696.html
Copyright © 2011-2022 走看看