数组的子数组之和的最大值

 1 #include<iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4 
 5 //最直接的方法
 6 int MaxSum(int* A, int n) {
 7     int maximum = 0xffffffff;
 8     int sum;
 9     for(int i = 0; i<n;i++) {
10         
11         for(int j = i; j < n; j++){
12             sum = 0;
13             for(int k = i; k <=j; k++) {
14                 sum += A[k];
15             } 
16             if(sum > maximum)
17                 maximum = sum;
18         }
19     }
20     return maximum;
21 }
22 
23 //二分法递归
24 
25 int BinarySum(int* A, int beg, int end) {
26     if(beg == end)
27         return A[beg];
28     int mid = (beg + end) / 2;
29     int leftSum = BinarySum(A, beg, mid);
30     int rightSum = BinarySum(A, mid+1, end);
31 
32     int midSum = A[mid+1];
33     int sum = A[mid+1];
34     for(int i = mid+2; i <= end; i++ ) {
35         sum += A[i];
36         if(midSum < sum)
37             midSum = sum;
38     }
39     midSum += A[mid];
40     sum = midSum;
41     for(i = mid-1; i>= beg; i--){
42         sum += A[i];
43         if(midSum < sum)
44             midSum = sum;
45     }
46     return ( leftSum>rightSum?leftSum:rightSum ) > midSum ? ( leftSum>rightSum?leftSum:rightSum ):midSum;
47 
48 }
49 
50 int main() {
51     int nums[2] = {1, 5};
52     //动态规划
53     int maxSum = nums[0];
54     int partSum = nums[0];
55     for(int i = 1; i < 2; i++) {
56         if(partSum < 0)
57             partSum = 0;
58 
59         partSum += nums[i];
60         
61         if(partSum > maxSum)
62             maxSum = partSum;
63     }
64     cout << maxSum << endl;
65 
66     cout << MaxSum(nums, 2)<<endl;
67 
68     cout <<  BinarySum(nums, 0, 1) << endl;
69     return 0;
70 }

 

posted @ 2014-06-17 10:48  soul390  阅读(148)  评论(0)    收藏  举报