感觉题解都说复杂了,琢磨了很久才搞明白,所以给大家说一下我的理解:
首先判断
1:包含最右边那个数的子序列能否大于0
2:包含最左边那个数的子序列能否大于0
如果满足那说明,最大序列有可能头尾相接
然后简单判断一下
1:普通的最大值
2:所有数之和 - 普通的最小值
这两个哪个大就输出哪个就行了
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
int n = nextInt();
int[] list = new int[n];
int sum = 0;
for (int i = 0; i < n; i++) {
list[i] = nextInt();
sum += list[i];
}
int dp_left = Integer.MIN_VALUE/2;
int dp_right = Integer.MIN_VALUE/2;
int dp_min = Integer.MAX_VALUE/2;
int min = Integer.MAX_VALUE/2;
int max = Integer.MIN_VALUE/2;
for (int i = 0; i < n; i++) {
dp_left = Math.max(list[i], dp_left + list[i]);
max = Math.max(dp_left, max);
}
for (int i = n-1; i >= 0; i--)
dp_right = Math.max(list[i], dp_right + list[i]);
for (int i = 0; i < n; i++) {
dp_min = Math.min(list[i], dp_min + list[i]);
min = Math.min(dp_min, min);
}
int ans = 0;
if(dp_left>0 && dp_right>0)
ans = Math.max(sum - min, max);
else
ans = max;
System.out.println(ans);
}
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static int nextInt() throws IOException {
st.nextToken();
return (int)st.nval;
}
static long nextLong() throws IOException {
st.nextToken();
return (long)st.nval;
}
}