3369: [Usaco2004 Feb]Pesky Parentheses 烦人括号
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 14 Solved: 7
[ Submit][ Status][ Discuss]
Description
奶牛们只学过加和减.她们写下了含有N(1≤N≤10)项的表达式,比如:
1+4 -2-1+10 -6
贝茜认识到地加上不同的括号,表达式会有不同的值.请帮她计算出表达示的最大值.
Input
第1行:整数N;
第2到N+1行:每行是一个整数K(-100≤K≤100),表示表达式中的一项.正整数K表
示+K,负整数K表示-K.
Output
一个整数,通过适当地加括号使表达示得到的最大值.
Sample Input
6
1 4 -2 -1 10 -6
Sample Output
20
感觉很难。。实际是道水题,n只有10,但其实复杂度也只有O(n²)
对于任意式子,如果在某个负号后面打上括号,那么下一个负号后面所有的数字都一定可以弄成正的
例如"1+2-3+4-5-6+7-8+9-10",如果在3前面打上括号,那么剩下的我只需要"1+2-(3+4-5-(6+7)-(8+9)-10)"这样打扩号就行了(把最外层括号里面所有连续的加号全部扩起来)一定是最优
即暴力枚举从哪个位置打第一个左括号,那么后面的括号位置确定
求出中间的最值就行了
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int a[1005], R[1005];
int main(void)
{
int n, i, j, now, sum, ans;
scanf("%d", &n);
for(i=1;i<=n;i++)
scanf("%d", &a[i]);
ans = 0;
for(i=n;i>=1;i--)
{
R[i] = R[i+1]+abs(a[i]);
ans += a[i];
}
sum = 0;
for(i=1;i<=n;i++)
{
sum += a[i];
if(a[i]<0)
{
now = sum;
for(j=i+1;j<=n;j++)
{
if(a[j]<0)
{
now += R[j];
ans = max(ans, now);
break;
}
now -= abs(a[j]);
}
}
}
printf("%d\n", ans);
return 0;
}