最大序列和(动态规划)
动态规划(java实现)
题目描述:
给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。 对于S的所有非空连续子序列T,求最大的序列和。 变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。
输入描述:
第一行为一个正整数N,第二行为N个整数,表示序列中的数。
输出描述:
输入可能包括多组数据,对于每一组输入数据, 仅输出一个数,表示最大序列和。
示例1:
输入
5 1 5 -3 2 4 6 1 -2 3 4 -10 6 4 -3 -1 -2 -5
输出
9 7 -1
问题分析:
使用动态规划的知识。如果子序列和加上新输入的数还要小于新输入的数,则子序列和更新为新输入的数,否则加上;同时比较子序列和与最大值,然后取其最大值。具体步骤如下:
1、首先设初始“子序列和”与“最大值”为长整数的最小值;
2、然后将“子序列和 + 新输入的数”与“输入的数”进行比较大小;
若“子序列和+新输入的数” 大于 “新输入的数”,则取“子序列和+输入的数”;
否则取“新输入的数”;
3、取“子序列和”与“最大值”中的最大值。
相关知识:
Math.max(tmpsum+tmp,tmp);
参考代码:
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); while (input.hasNext()) { int num = input.nextInt(); long tmp; long max = input.nextLong(); long tmpsum=max; for (int i=1; i<num; i++) { tmp = input.nextLong(); tmpsum = Math.max(tmpsum+tmp,tmp); /* if (tmpsum+tmp > tmp) { tmpsum += tmp; //先判断要不要加 } else { tmpsum = tmp; }*/ if (tmpsum > max) { max = tmpsum; //取最大值 } } System.out.println(max); } } }