NOIP2020.9.26模拟jerry
Description
众所周知,Jerry 鼠是一只非常聪明的老鼠。Jerry 聪明到它可以计算 64 位有符号整形数字的加减法。现在,Jerry 写下了一个只由非负整数和加减号组成的算式。它想给这个算式添加合法的括号,使得算式的结果最大。这里加减法的运算优先级相同,和我们在日常生活中接触到的一样,当没有括号时,先算左边的,再算右边的。比如,算式 (1+2)+3−(4−5)+6 是合法的,但是 )1+2( 和 (−)1+2 以及 −(1)+2 都是不合法的。
Input
输入文件为 jerry.in。第一行一个整数 T,代表数据组数。接下来,共有 T 组数据,每组的格式如下:第一行一个整数 n,代表数字的个数。接下来一行共 2n − 1 个符号或非负整数,组成一个由空格隔开的算式。
Output
输出文件为 jerry.out。一行一个整数,代表添加括号后,算式最大的可能结果。
Sample Input
输入样例1:
1
3
5 - 1 - 3
输入样例2:
1
4
1 - 1 - 1 - 3
Sample Output
输出样例1
7
输出样例2
4
Data Constraint
Hint
对于第一个样例:5 − (1 − 3) = 7
对于第二个样例:1 − (1 − 1 − 3) = 4
题解
题意
对一个只含有加减法的式子加括号,使和最大
分析
可以想到DP
发现只有负号后加括号才对答案有额外贡献
设f[i][j]为第i个数,前面有j个左括号没有匹配
可以转移到f[i+1][j-1],f[i+1][j],f[i+1][j+1]
转移方程很好推,要注意符号的变化
时间O(n^2)
经过证明 模拟,j最多只能取2
code
#include<cstdio>
#include<cctype>
#include<cstdlib>
#define ll long long
#define R register
using namespace std;
const int N=1e5+15;
int n,sig[N];
ll f[N][3],a[N];
inline void init(R int x){