1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <algorithm> #include <iostream> using namespace std; int n, a[1005]; struct Node { int h, j, m, w; Node(const int _h, const int _j, const int _m, const int _w): h(_h), j(_j), m(_m), w(_w) { } Node operator+ (const Node &o) const { return Node( max(h, w + o.h), max(max(j, o.j), m + o.h), max(m + o.w, o.m), w + o.w); } }; Node solve1(int h, int m) { if (h > m) return Node(-1, -1, -1, -1); if (h == m) return Node(max(a[h], 0), max(a[h], 0), max(a[h], 0), a[h]); int j = (h + m) >> 1; return solve1(h, j) + solve1(j + 1, m); } int solve2(int h, int m) { if (h > m) return -1; if (h == m) return max(a[h], 0); int j = (h + m) >> 1; int wh = 0, wm = 0; int wht = 0, wmt = 0; for (int i = j; i >= h; i--) { wht += a[i]; wh = max(wh, wht); } for (int i = j + 1; i <= m; i++) { wmt += a[i]; wm = max(wm, wmt); } return max(max(solve2(h, j), solve2(j + 1, m)), wh + wm); } int main(){ cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; cout << solve1(1, n).j << endl; cout << solve2(1, n) << endl; return 0; } |
假设输入的所有数的绝对值都不超过1000,完成下面的判断题和单选题:
0 of 6 Questions completed
Questions:
You have already completed the quiz before. Hence you can not start it again.
Quiz is loading…
You must sign in or sign up to start the quiz.
You must first complete the following:
0 of 6 Questions answered correctly
Your time:
Time has elapsed
You have reached 0 of 0 point(s), (0)
Earned Point(s): 0 of 0, (0)
0 Essay(s) Pending (Possible Point(s): 0)
1、 程序总是会正常执行并输出两行两个相等的数。( )
2、第 28 行与第 38 行分别有可能执行两次及以上。( )
3、当输入为“5 -10 11 -9 5 -7”时,输出的第二行为“7”。( )
4、solve1(1, n) 的时间复杂度为( )。
5、solve2(1, n) 的时间复杂度为( )。
6、当输入为“10 -3 2 10 0 -8 9 -4 -5 9 4”时,输出的第一行为( )。