Loading

考研机试 22.最大序列和

 

时间:2021/03/05

 

一.题目描述

给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。 对于S的所有非空连续子序列T,求最大的序列和。 变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。

输入描述

第一行为一个正整数N,第二行为N个整数,表示序列中的数。

输出描述

输入可能包括多组数据,对于每一组输入数据,
仅输出一个数,表示最大序列和。

题目链接

https://www.nowcoder.com/practice/df219d60a7af4171a981ef56bd597f7b?tpId=40&tqId=21353&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey

 

二.算法

题解

该题可以通过暴力求解解决,但是时间复杂度比较高。最好通过动态规划的方法求解,动态规划问题最重要的是找到递推关系,该题的递推关系是:a[i]=max(a[i], a[i] + a[i-1])。

重点

动态规划的题目要找到递推关系

代码

import java.util.Scanner;

public class Main{
    
    public static void main(String[] args){
        
        Scanner in = new Scanner(System.in);
        
        //读取输入
        while(in.hasNext()){
            int n = in.nextInt();
            int[] numbers = new int[n];
            long max = Long.MIN_VALUE;
            
            for(int i = 0; i < n; i++){
                numbers[i] = in.nextInt();
            }
            
            //求最大序列和
            for(int i = 1; i < n; i++){
                numbers[i] = Math.max(numbers[i], numbers[i] + numbers[i - 1]);
                max = Math.max(numbers[i], max);
            }
            
            max = Math.max(numbers[0], max);
            
            System.out.println(max);
        }
    }
}

 

posted @ 2021-03-05 20:36    阅读(47)  评论(0编辑  收藏  举报