不是VIP会员,不能显示答案

题目解答

题目:
#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,完成下面的判断题和单选题:



判断题

1) 程序总是会正常执行并输出两行两个相等的数。( )

2) 第28行与第38行分别有可能执行两次及以上。( )

3) 当输入为“5-10 11-95-7”时,输出的第二行为“7”。( )


选择题

4) solve1(1, n)的时间复杂度为( )。

5) solve2 (1,n) 的时间复杂度为()。

6) 当输入为“10 -3 2 10 0 -8 9 -4 -5 9 4”时,输出的第一行为( )。
考点:
分析:
解答:
评论:
老师: