题目大意
一个表达式有+有-,添加一些括号最大化表达式的值。
DP
首先只会在-号前放左括号。
简单的想法是设f[i,j]表示做完前i个数字,目前还有j个左括号没有匹配右括号。
然后很难发现,j<=2才有意义。
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=100000+10;
const ll inf=1000000000000000000;
int a[maxn];
char s[maxn];
ll f0,f1,f2;
int i,j,k,l,t,n,m;
int read(){
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9'){
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
char get(){
char ch=getchar();
while (ch!='+'&&ch!='-') ch=getchar();
return ch;
}
int main(){
n=read();a[0]=read();
n--;
fo(i,1,n){
s[i]=get();
a[i]=read();
}
f0=a[0];f1=f2=-inf;
fo(i,1,n){
if (s[i]=='-'){
f0-=(ll)a[i];
f1+=(ll)a[i];
f2-=(ll)a[i];
if (f1>f2) f2=f1;
if (f0>f1) f1=f0;
}
else{
f0+=(ll)a[i];
f1-=(ll)a[i];
f2+=(ll)a[i];
}
if (f2>f1) f1=f2;
if (f1>f0) f0=f1;
}
printf("%lld\n",f0);
}
本文介绍了一种使用动态规划解决表达式最大值问题的方法。通过放置括号来最大化包含加减运算的算术表达式的值。文章详细讨论了状态定义及转移方程,并给出了完整的C++代码实现。
9880

被折叠的 条评论
为什么被折叠?



