import java.util.Scanner;
import static java.lang.Math.*;
public class Main {
/**
* O(n) algorithm.
*/
public static int longestSubsequence1(int[] p, int n) {
int thisSum = 0;
int maxSum = 0;
for (int i = 0; i < n; i++) {
thisSum += p[i];
if (thisSum > maxSum) {
maxSum = thisSum;
}
if (thisSum < 0)
thisSum = 0;
}
return maxSum;
}
/**
* O(n*log(n)) algorithm
*/
public static int longestSubsequence2(int[] p, int l, int r) {
if(l == r)
return p[l];
if(l < r) {
int mid = (l + r) / 2;
int leftSum = longestSubsequence2(p, l, mid-1);
int rightSum = longestSubsequence2(p, mid + 1, r);
int maxLeft, maxRight;
int thisLeft, thisRight;
thisLeft = thisRight = maxLeft = maxRight = 0;
for (int i = mid-1; i >= l; i--) {
thisLeft += p[i];
maxLeft = max(maxLeft, thisLeft);
}
for (int i = mid; i <= r; i++) {
thisRight += p[i];
maxRight = max(maxRight, thisRight);
}
int maxSum = maxLeft+maxRight;
maxSum = max(maxSum, max(leftSum, rightSum));
return maxSum ;
}
return 0;
}
public static void main(String[] args) {
int k;
int[] p;
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
k = scanner.nextInt();
p = new int[k];
for (int i = 0; i < k; i++) {
p[i] = scanner.nextInt();
}
//System.out.println(longestSubsequence1(p, k));
System.out.println(longestSubsequence2(p, 0, k-1));
}
}
01-复杂度1 最大子列和问题(20 分)
最新推荐文章于 2020-10-30 19:21:48 发布