PAT 1007. Maximum Subsequence Sum (25)

http://www.patest.cn/contests/pat-a-practise/1007

 

经典的最大子序列和

样例太具有迷惑性了, 我以为输出的数组下标, 结果一直不过, 原来是输出的子序列最后一个数和第一个数, 样例中数组下标和子序列中的数是一样的

//O(n)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 int maxsum(int *a, int n, int *l, int *r) {
 5     int thissum, maxsum, i;
 6     thissum = 0; 
 7     maxsum = -1;
 8     int start = 0;
 9     for (i = 0; i < n; ++i) {
10         thissum += a[i];
11         if (thissum > maxsum) {
12             maxsum = thissum;
13             *l = start;
14             *r = i;
15         }
16         if (thissum < 0) {
17             start = i + 1;
18             thissum = 0;
19         }
20     }
21     return maxsum;
22 }
23 
24 #define MAXN 10010
25 int a[MAXN];
26 int n;
27 int main() {
28     scanf("%d", &n);
29     int i;
30     for (i = 0; i < n; ++i) {
31         scanf("%d", a + i);
32     }
33     int l = 0, r = 0;
34     int result = maxsum(a, n, &l, &r);
35     if (result < 0) {
36         result = 0; 
37         l = 0;
38         r = n - 1;
39     }
40     printf("%d %d %d\n", result, a[l], a[r]);
41     return 0;
42 }

 

 

//分治O(nlogn)

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 
 5 #define MAXN 10010
 6 
 7 int a[MAXN];
 8 int n;
 9 
10 int maxsum(int *a, int x, int y, int *l, int *r) {
11     int v, L, R, maxs;
12     if (y - x == 1) {
13         *l = *r = x;
14         return a[x];
15     }
16 
17     int m = x + ((y - x) >> 1);
18     int left_l = 0, left_r = 0;
19     int left_sum = maxsum(a, x, m, &left_l, &left_r);
20     int right_l = 0, right_r = 0;
21     int right_sum = maxsum(a, m, y, &right_l, &right_r);
22 
23     if (left_sum >= right_sum) {
24         maxs = left_sum;
25         *l = left_l;
26         *r = left_r;
27     } else {
28         maxs = right_sum;
29         *l = right_l;
30         *r = right_r;
31     }
32 
33     v = 0, L = a[m - 1];
34     int i = 0;
35     int mid_l, mid_r;
36     mid_l = m - 1;
37     for (i = m - 1; i >= x; --i) {
38         if (L <= (v += a[i])) {
39             mid_l = i;
40             L = v;
41         }
42     }
43 
44     v = 0, R = a[m], mid_r = m;
45     for (i = m; i < y; ++i) {
46         if (R < (v += a[i])) {
47             mid_r = i;
48             R = v;
49         }
50     }
51 
52     L += R;
53     if (L > maxs) {
54         *l = mid_l;
55         *r = mid_r;
56         return L;
57     } else if (L == maxs) {
58         if (*l > mid_l) {
59             *l = mid_l;
60             *r = mid_r;
61         } else if (*l == mid_l) {
62             *r = *r > mid_r ? mid_r : *l;
63         }
64     }
65     return maxs;
66 }
67 
68 int main() {
69 #ifdef DEBUG
70     freopen("input", "r", stdin);
71 #endif
72     scanf("%d", &n);
73     int i;
74     for (i = 0; i < n; ++i) {
75         scanf("%d", a + i);
76     }
77 
78     int l, r;
79     int result = maxsum(a, 0, n, &l, &r);
80     if (result < 0) {
81         l = 0, r = n - 1;
82         result = 0;
83     }
84     printf("%d %d %d\n", result, a[l], a[r]);
85     return 0;
86 }

 

posted @ 2015-07-29 10:57  ACSeed  Views(228)  Comments(0)    收藏  举报