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 }

浙公网安备 33010602011771号