nyoj 174Max Sequence&poj 2593(dp)

来源:互联网 发布:nginx php fpm 优化 编辑:程序博客网 时间:2024/06/16 19:09
考察点:动态规划

  思路:虽然题目给出了3000ms的时间,但考虑到数据量可以达到100000,如果用O(N^2)的算法的话,还是极有可能会超时的,于是决定采用这种O(N)时间效率的动规。在输入的同时,进行一次DP,计算出从左到右的最大值,并把它保存在数组dp的对应的下标元素中,这样之后,对于下标为i 的元素,它其中保存的便是前面所有元素可能的最大连续和。再从右到左进行一次DP,计算从右到左的最大连续和。假设此时已经算到下标为i的元素,那么将 sum+dp[i-1]与ans进行比较,将ans取较大者。

import java.util.Scanner;public class Main {public static void main(String[] args) {  Scanner scanner=new Scanner(System.in);  while(scanner.hasNext())  { int number=scanner.nextInt(); if(number==0)break; int result[]=new int[number]; int dp[]=new int[number]; int max=-999,sum1=0; for(int i=0;i<number;i++) { result[i]=scanner.nextInt(); sum1+=result[i]; if(sum1>max) max=sum1; dp[i]=max; if(sum1<0) sum1=0; }  int sum2=0,answer=-999; for(int i=number-1;i>0;i--) { sum2+=result[i]; if(dp[i-1]+sum2>answer) answer=dp[i-1]+sum2; if(sum2<0) sum2=0; } System.out.println(answer);  }}}