连续子数组的最大和

来源:互联网 发布:淘宝话费充值软件 编辑:程序博客网 时间:2024/06/14 14:58

题目描述

一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3

输入描述:

输入为两行。第一行一个整数n(1 <= n <= 100000),表示一共有n个元素第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。

输出描述:

所有连续子数组中和最大的值。


动态规划:

设sum[i]为以第i个元素结尾且和最大的连续子数组。假设对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且和最大的连续子数组实际上,要么是以第i-1个元素结尾且和最大的连续子数组加上这个元素,要么是只包含第i个元素,即sum[i] = max(sum[i-1] + a[i], a[i])。可以通过判断sum[i-1] + a[i]是否大于a[i]来做选择,而这实际上等价于判断sum[i-1]是否大于0。由于每次运算只需要前一次的结果,因此并不需要像普通的动态规划那样保留之前所有的计算结果,只需要保留上一次的即可,因此算法的时间和空间复杂度都很小。


result = a[1]
sum = a[1]


for i: 2 to LENGTH[a]
  if sum > 0
    sum += a[i]
  else
    sum = a[i]


  if sum > result
    result = sum


return result


动态规划:sum[i] = max(sum[i-1] + a[i], a[i])



java:

import java.util.Scanner;
 
public class Main {
    public static int getMaxSum(int [] array,int n){
        if(array.length==0||array == null)
            return 0;
        int currentSum = array[0];
        int currentMax = array[0];
        for(int i = 1;i<n;i++){
            if(currentSum<0){
                currentSum=array[i];
            }
            else{
                currentSum+=array[i];
            }
            if(currentSum>currentMax){
                currentMax=currentSum;
            }
        }
        return currentMax;
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub4
         
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
         
        int [] array = new int[n];
        for(int i=0;i<n;i++){
            array[i] = scan.nextInt();
        }
         
        System.out.println(getMaxSum(array, n));
 
    }
 
}


我的版本:

import java.util.Scanner;


public class Main{
    public static void main(String[] agrs){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] array = new int[n];
        for(int i=0;i<n;i++){
            array[i]=sc.nextInt();
        }
        
        
        int result = great(array);
        System.out.println(result);
     }
     public static int great(int[] a){
        int currentSum = a[0];
        int greatSum = a[0];
            for(int i=0;i<a.length;i++){
                if(currentSum<=0){
                    currentSum = a[i];
                }
                else{
                    currentSum = currentSum+a[i];
                }
                if(currentSum>greatSum){
                    greatSum = currentSum;
                }
            }
            return greatSum;
        }
}

python:

m = int(raw_input())
ifm==0:
    print None
ary = map(int, raw_input().split())
ifm==1:
    print ary[0]
cur = ary[0]
res = ary[0]
fori in range(1,len(ary)):
    ifcur<=0:
        cur = ary[i]
    else:
        cur += ary[i]
    ifcur > res:
        res = cur
print res


自己的:

n = int(raw_input())
ary = map(int,raw_input().split())
curr = ary[0]
ress = ary[0]
for i in range(0,len(ary)):
    if curr<=0:
        curr = ary[i]
    else:
        curr += ary[i]
    if curr > ress:
        ress = curr
print (ress)

ary = map(int, raw_input().split())中ary最后得到的是一个数组

原创粉丝点击