01-复杂度1 最大子列和问题(20 分)

来源:互联网 发布:mac删除系统文件 编辑:程序博客网 时间:2024/06/05 21:59
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));}}

原创粉丝点击