• 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())

    输出结果:

     

     

  • 相关阅读:
    java基础-集合笔记
    Spring工具类
    XStream的基本使用
    java之路径问题
    Vue 动态组件渲染问题分析
    watch案例解析(element-ui el-select 无法选中问题剖析)
    v-if案例解析(element-ui form-item 结合 v-if 动态生成rule规则表单元素,表单无法验证问题剖析 )
    Vue 虚拟Dom 及 部分生命周期初探
    Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发"鼻涕"下拉粘连效果
    AngularJs(SPA)单页面SEO以及百度统计应用(下)
  • 原文地址:https://www.cnblogs.com/xiaodangdang/p/13212318.html
Copyright © 2020-2023  润新知