代码改来改去,从2分改到25分,结果一看,啥都没改,不知道怎么回事。
启发:1.当Scanner读取超时时,考虑用BufferedReader +InputStreamReader或者c++;
2.最长最大序列这类动态规划的问题,一般是 当前和 触底 的时候进行重置操作,超过最大值 进行更新操作
3.细节地方,左边的i+1可能会越界需要中间值进行过渡(即left接受的是迟一步的更新,此时因为已经出循环,故可以避免越界问题)
package pta;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class P1007 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
String[] arr1 = br.readLine().split(" ");
int[] arr = new int[num];
int left = 0,right = num-1;
int temp = 0,this_max=0,max=-1;
//tips1:temp是左边界赋值的中间变量,作用是缓冲,避免直接把 i+1赋值给左边界(因为循环是全部遍历,当到达最后时存在i+1越界的情况)
for(int i = 0;i<num;i++){
arr[i] = Integer.parseInt(arr1[i]);
this_max+=arr[i];
if(this_max>max){ //更新条件:当前值>最大值,等于不能要(不要才能符合题干取最小的i和j)
max=this_max;
left=temp;
right=i;
}
else if(this_max<0){ //重置条件:当前值<最小能接受值(题干中说的是0)
this_max=0;
temp=i+1;
}
}
if(max<0)
max = 0;
System.out.println(max+" "+arr[left]+" "+arr[right]);
}
}