有道第三题求最大子序列和 [求分析内存消耗]语言 Java
源码如下,提交BOJ然后MLE,内存用了234440kB,不知道在哪里开销比较大,求大牛不吝赐教~
public class Main {
static int data[] = new int[50001];
static int ff[] = new int[50001];
static int bb[] = new int[50001];
static int solve(int n) {
int s = 0;
for (int i = 0; i < n; ++i) {
if (i > 0)
ff[i] = ff[i - 1];
else
ff[i] = 0;
if (s < 0)
s = 0;
s += data[i];
ff[i] = ff[i] > s ? ff[i] : s;
}
s = 0;
for (int i = n - 1; i >= 0; --i) {
if (i < n - 1)
bb[i] = bb[i + 1];
else
bb[i] = 0;
if (s < 0)
s = 0;
s += data[i];
bb[i] = bb[i] > s ? bb[i] : s;
}
int ans = 0;
for (int i = 0; i < n - 1; ++i)
ans = ans > (ff[i] + bb[i + 1]) ? ans : (ff[i] + bb[i + 1]);
return ans;
}
public static void main(String[] args) {
java.util.Scanner sin = new java.util.Scanner(System.in);
int T = sin.nextInt();
while (--T > -1) {
int n = sin.nextInt();
int sum = 0, cnt = 0;
for (int i = 0; i < n; ++i) {
data[i] = sin.nextInt();
sum += data[i];
if (data[i] > 0)
cnt++;
}
if (cnt <= 2) {
System.out.println(sort(n));
continue;
}
int s1 = solve(n);
for (int i = 0; i < n; ++i)
data[i] = -data[i];
int s2 = sum + solve(n);
System.out.println(s1 > s2 ? s1 : s2);
}
}
static int sort(int n) {
int ret[] = new int[2];
ret[0] = ret[1] = -10001;
for (int i = 0; i < n; i++)
if (data[i] > ret[0]) {
ret[1] = ret[0];
ret[0] = data[i];
} else if (data[i] > ret[1]) {
ret[1] = data[i];
}
return ret[0] + ret[1];
}
}