zoukankan      html  css  js  c++  java
  • pyhton 活力练习Day26

    题目描述:

    输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)

    输入描述:

    【重要】第一行为数组的长度N(N>=1)

    接下来N行,每行一个数,代表数组的N个元素

    输出描述:

    最大和的结果

    思路:

    本题主要考察的知识点:动态规划

    本题的思路可以转化为:“对数组中的任意元素,若我们知道以它作为最后一个元素的所有连续子数组的最大和是多少,那么原问题的解就是在这n个最大和中最大的那个。

    ”再来看如何求解“对数组中的任意元素,若我们知道以它作为最后一个元素的所有连续子数组的最大和是多少”。因为有了2个限制条件“连续”、“它是最后一个”,那么问题又可以再次“减治”,等价于“若我们知道它上一个元素作为最后一个元素的所有连续子数组的最大和是多少,只要它不是负数,那么此问题就是它加上最后一个元素的值,否则直接用最后一个元素的值即可”。

    以数组【1, -2, 3, 10, -4, 7, 2, -5】为例来进行说明:

    遍历数组:

    结尾元素 可能取值 最大值 最终最大值
    1 1 1 1
    -2 1+(-2)/-2 -1 1
    3 -1+3/3 3 3
    10 3+10/10 13 13
    -4 13+(-4)/-4 9 13
    7 9+7/7 16 16
    2 16+2/2 18 18
    -5 18+(-5)/-5 13 18

    python代码实现:

     1 #输入
     2 def max_sum():
     3     #输入的数据个数
     4     N = int(input())
     5     #保存输入的数据
     6     input_N = []
     7     for _ in range(N):
     8         input_N.append(int(input()))
     9     #保存以每个元素结尾的最大值
    10     s = [0 for _ in range(N)]  #初始化
    11     s[0] = input_N[0]
    12     for i in range(1,N):
    13         s[i] = s[i-1] + input_N[i]
    14         s[i] = max(s[i],input_N[i])
    15     #计算以每个元素结尾的最大值(n个)的最大值
    16     max_s = max(s)
    17     
    18     return max_s
    19 
    20 print(max_sum())

    输出结果:

     

     

  • 相关阅读:
    Android数据存储之File
    Openfiler使用说明
    nginx的upstream目前支持5种方式的分配
    centOS 6.5关闭防火墙步骤
    yum下载文件的存放位置
    ubuntu如何开启root,如何启用Ubuntu中root帐号
    ubuntu下的apt-get内网本地源的搭建
    [转]StarWind模拟iSCSI设备
    ORACLE删除某用户下所有对象
    [转]oracle导入提示“IMP-00010:不是有效的导出文件,头部验证失败”的解决方案
  • 原文地址:https://www.cnblogs.com/xiaodangdang/p/13212318.html
Copyright © 2011-2022 走看看