您的位置:首页 > Web前端

bzoj 3369: [Usaco2004 Feb]Pesky Parentheses 烦人括号(思维题)

2018-03-18 19:01 531 查看

3369: [Usaco2004 Feb]Pesky Parentheses 烦人括号

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 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

61 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: