原题链接
题目描述
Monocarp had a sequence aa consisting of n + mn+m integers a_1, a_2, \dots, a_{n + m}a
1
?
,a
2
?
,…,a
n+m
?
. He painted the elements into two colors, red and blue; nn elements were painted red, all other mm elements were painted blue.
After painting the elements, he has written two sequences r_1, r_2, \dots, r_nr
1
?
,r
2
?
,…,r
n
?
and b_1, b_2, \dots, b_mb
1
?
,b
2
?
,…,b
m
?
. The sequence rr consisted of all red elements of aa in the order they appeared in aa ; similarly, the sequence bb consisted of all blue elements of aa in the order they appeared in aa as well.
Unfortunately, the original sequence was lost, and Monocarp only has the sequences rr and bb . He wants to restore the original sequence. In case there are multiple ways to restore it, he wants to choose a way to restore that maximizes the value of
f(a)=max?(0,a1,(a1+a2),(a1+a2+a3),…,(a1+a2+a3+?+an+m))</p><p>HelpMonocarptocalculatethemaximumpossiblevalueoff(a)f(a)f(a) = \max(0, a_1, (a_1 + a_2), (a_1 + a_2 + a_3), \dots, (a_1 + a_2 + a_3 + \dots + a_{n + m})) </p><p>Help Monocarp to calculate the maximum possible value of f(a)f(a)f(a)=max(0,a1?,(a1?+a2?),(a1?+a2?+a3?),…,(a1?+a2?+a3?+?+an+m?))</p><p>HelpMonocarptocalculatethemaximumpossiblevalueoff(a)f(a).
输入格式
The first line contains one integer tt ( 1 \le t \le 10001≤t≤1000 ) — the number of test cases. Then the test cases follow. Each test case consists of four lines.
The first line of each test case contains one integer nn ( 1 \le n \le 1001≤n≤100 ).
The second line contains nn integers r_1, r_2, \dots, r_nr
1
?
,r
2
?
,…,r
n
?
( -100 \le r_i \le 100?100≤r
i
?
≤100 ).
The third line contains one integer mm ( 1 \le m \le 1001≤m≤100 ).
The fourth line contains mm integers b_1, b_2, \dots, b_mb
1
?
,b
2
?
,…,b
m
?
( -100 \le b_i \le 100?100≤b
i
?
≤100 ).
输出格式
For each test case, print one integer — the maximum possible value of f(a)f(a) .
题意翻译
多测。
给定两个序列 rr 和 bb,现在可以将它们合并成一个序列,要求是原来同组内的元素相对顺序不变。
设合并后是长度为 nn 的序列 aa。
定义该序列的权值为:
\max_{0\le i\le n}(\sum_{j=1}^ia_j)
0≤i≤n
max
?
(
j=1
∑
i
?
a
j
?
)
你现在需要找到并输出这个最大值。
输入输出样例
输入 #1复制
4
4
6 -5 7 -3
3
2 3 -4
2
1 1
4
10 -3 2 2
5
-1 -2 -3 -4 -5
5
-1 -2 -3 -4 -5
1
0
1
0
输出 #1复制
13
13
0
0
说明/提示
In the explanations for the sample test cases, red elements are marked as bold.
In the first test case, one of the possible sequences aa is [\mathbf{6}, 2, \mathbf{-5}, 3, \mathbf{7}, \mathbf{-3}, -4][6,2,?5,3,7,?3,?4] .
In the second test case, one of the possible sequences aa is [10, \mathbf{1}, -3, \mathbf{1}, 2, 2][10,1,?3,1,2,2] .
In the third test case, one of the possible sequences aa is [\mathbf{-1}, -1, -2, -3, \mathbf{-2}, -4, -5, \mathbf{-3}, \mathbf{-4}, \mathbf{-5}][?1,?1,?2,?3,?2,?4,?5,?3,?4,?5] .
In the fourth test case, one of the possible sequences aa is [0, \mathbf{0}][0,0] .
思路
分别求两个数组最大的前缀和再相加即可,因为合并后的序列也是要求和找最大值,且是从左到右依次相加,不能跳,所以找两个数组的最大值,然后把两个最大值的区间放在一起即可。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;while(t--){
int a,b;cin>>a;int maxnn=0,maxn=0;int num[10005]={
0},num1[10005]={
0},sum[10005]={
0},sum1[10005]={
0};for(int i=1;i<=a;i++) {
cin>>num[i];sum[i]=sum[i-1]+num[i];maxn=max(sum[i],maxn);}cin>>b;for(int i=1;i<=b;i++){
cin>>num1[i];sum1[i]=sum1[i-1]+num1[i];maxnn=max(maxnn,sum1[i]);}cout<<maxn+maxnn<<endl;}return 0;
}