Description
Alice 和Bob 正在对两个序列a1, a2,..., an 和b1, b2,...,bm 进行操作。
Alice 首先需要将它们归并成一个长度为n + m 的序列c1,c2,...,cn+m。即将序列a 和b 合并成一个序列c,但不改变a 和b 的顺序。显然可能有许多许多种不同的归并结果。
Bob 需要在Alice 完成归并之后, 选择一对l,r, 满足1 ≤ l ≤ r ≤ n + m, 并使得score = cl + cl+1 + cl+2 + ...+ cr−1 + cr 尽可能地大。
不同的归并结果以及不同的选择l,r 的方式都会使得最后score 的值不尽相同,请问score 最多能达到多少呢?
Input
第一行包含一个正整数T(1 ≤ T ≤ 10),表示测试数据的组数。
每组测试数据第一行包含两个正整数n,m(1 ≤ n,m ≤ 100000),分别表示序列a 和序列b 的长度。
第二行包含n 个整数a1, a2,..., an(−109 ≤ ai ≤ 109)。
第三行包含m 个整数b1,b2,..., bm(−109 ≤ bi ≤ 109)。
输入数据保证a 和b 中至少有一个正数。
Output
对于每组测试数据,输出一行一个整数,即score 的最大值。
Sample Input
1
2 3
1 5
3 -1 -1
Sample Output
9
注释:本题属于最大连续子序列的问题。
代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long int x1,x2;
int t;
cin>>t;
while(t--){
long long int n,m,x;
cin>>n>>m;
x1=0;
x2=0;
long long int ans1=0,ans2=0;
for(int i=0;i<n;i++){
cin>>x;
x1 += x;
if(x1 > ans1)
ans1 = x1;
if(x1 < 0)
x1 = 0;
}
for(int i=0;i<m;i++){
cin>>x;
x2 += x;
if(x2 > ans2)
ans2 = x2;
if(x2 < 0)
x2 = 0;
}
printf("%lld\n",ans1+ans2);
}
}