考察点:动态规划
思路:虽然题目给出了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);
}
}
}