codeforces 552 E Vanya and Brackets

题意是这样,给出一个运算符只有+跟*,数字都在1到9之间的算式,要你加入一对括号,使得算式的结果尽可能的大,保证最多十五个乘号。

很显然,若要让加入的括号能够影响原本运算的结果,必然是要影响乘法,那么加入的这对括号中必然至少有一个跟乘号是相邻的,恰好乘号的数目很小,那么直接枚举括号的位置即可,每次算出当前解更新ans即可。

#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<climits>
#include<list>
#include<iomanip>
#include<stack>
#include<set>
using namespace std;
typedef long long ll;
ll x[3000];
bool s[3000];
ll work(int l,int r,int l1,int r1)
{
	ll ans=0;
	for(int i=l;i<=r;i++)
	{
		if(i==l1)
			i=r1;
		if(s[i])
			ans+=x[i];
		else
		{
			ll t=1;
			for(int j=i;j<=r;j++)
			{
				if(j==l1)
					j=r1;
				t*=x[j];
				if(s[j]||j==r)
				{
					i=j;
					break;
				}
			}
			ans+=t;
		}
	}
	return ans;
}
int main()
{
	int n=0,m=0;
	for(int i=0;;i++)
	{
		char c=getchar();
		if(c=='\n')
			break;
		if(i&1)
			s[m++]=(c=='+');
		else
			x[n++]=c-'0';
	}
	ll ans=work(0,n-1,-1,-1);
	for(int i=0;i<m;i++)
		if(!s[i])
		{
			for(int j=0;j<=i;j++)
			{
				ll t=work(j,i,-1,-1);
				swap(t,x[i]);
				ans=max(ans,work(0,n-1,j,i));
				swap(t,x[i]);
			}
			for(int j=i+1;j<n;j++)
			{
				ll t=work(i+1,j,-1,-1);
				swap(t,x[j]);
				ans=max(ans,work(0,n-1,i+1,j));
				swap(t,x[j]);
			}
		}
	cout<<ans;
}

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Vanya is doing his maths homework. He has an expression of form ,
where x1,?x2,?...,?xn are
digits from 1 to 9, and
sign  represents
either a plus ‘+‘ or the multiplication sign ‘*‘.
Vanya needs to add one pair of brackets in this expression so that to maximize the value of the resulting expression.

Input

The first line contains expression s (1?≤?|s|?≤?5001, |s| is
odd), its odd positions only contain digits from 1 to 9,
and even positions only contain signs ?+? and ?*?.

The number of signs ?*? doesn‘t exceed 15.

Output

In the first line print the maximum possible value of an expression.

Sample test(s)

input

3+5*7+8*4

output

303

input

2+3*5

output

25

input

3*4*5

output

60

Note

Note to the first sample test. 3?+?5?*?(7?+?8)?*?4?=?303.

Note to the second sample test. (2?+?3)?*?5?=?25.

Note to the third sample test. (3?*?4)?*?5?=?60 (also many other variants are valid, for instance, (3)?*?4?*?5?=?60).

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-08 19:43:42

codeforces 552 E Vanya and Brackets的相关文章

codeforces 552 C Vanya and Scales

这个题的意思就是给出一个数m.以及一个以1为首元素.w为比例常数的等比数列,数列长度为101,数列中每一个数字最多仅仅能用一次.问是否存在xa+wb+--=wc+wd+--+we+m. 非常显然,换句话说就是问,是否存在m=wa+wb+--+wf-wc-wd----we.再进行化简就能够得到.是在问,是否存在m=((((wh±1)wi±1)±1)wj±1)wk--. 那么非常显然可以进行搜索,比方说用广搜,每次当前的m±1中若有因子w就所有约掉,然后丢到队列中,否则就不用管,仅仅要队列中可以出现

CodeForces - 552E Vanya and Brackets

Vanya and Brackets Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Description Vanya is doing his maths homework. He has an expression of form , where x1, x2, ..., xn are digits from 1 to 9, and sign represents either a p

Codeforces 552E Vanya and Brackets(贪心 + 表达式计算)

题目链接 Vanya and Brackets 题目大意是给出一个只由1-9的数.乘号和加号组成的表达式,若要在这个表达式中加上一对括号,求加上括号的表达式的最大值. 我们发现,左括号的位置肯定是最左端或者某个乘号右边,右括号的位置肯定是最右段或者某个乘号左边. 而乘号最多只有15个,那么暴力枚举就可以了. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b);

Vanya and Brackets

Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 552E Description Vanya is doing his maths homework. He has an expression of form , where x1, x2, ..., xn are digits from 1 to9, and sign  

codeforces 508 E. Arthur and Brackets

题目链接: http://codeforces.ru/problemset/problem/508/E 题意: 有n对括号,按顺序,给出每对括号长度的范围,输出一种情况. 限制: 1 <= n <= 600 思路: 贪心:能匹配的先匹配. 括号匹配问题,果断先思考用栈能不能做. C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3

codeforces 629C Famil Door and Brackets (dp + 枚举)

题目链接: codeforces 629C Famil Door and Brackets 题目描述: 给出完整的括号序列长度n,现在给出一个序列s长度为m.枚举串p,q,使得p+s+q是合法的括号串,长度为n,问p,q的取值数目. 解题思路: 枚举p的长度,可以直接得到q的长度.因为要满足在任意位置'(' 数目大于 ’)‘ 的数目,所以统计一下s串中 ’(‘ - ')' 的最小数目minx.dp[i][j] 代表 到位置 i 时,满足 '(' - ')' == j 的情况数目.然后枚举p的 j

CodeForces 149D 区间DP Coloring Brackets

染色有三个条件: 对于每个点来说要么不染色,要么染红色,要么染蓝色 对于每对配对的括号来说,有且只有一个一边的括号被染色 相邻的括号不能染成相同的颜色 首先可以根据给出的括号序列计算出括号的配对情况,具体来说就是第i个括号与R[i]个括号配对. 对于一个正规配对括号序列(correct bracket sequence),d(l, r, c1, c2)表示括号序列S[i]~S[j],i左边括号的颜色是c1,r右边的括号颜色是c2(0表示没有染色),这样的序列的染色方法数. 与S[i]配对的可能是

CodeForces 629C Famil Door and Brackets

DP.听了同学的讲解才会的. 具体做法:dp[i][j]表示长度为 i 的括号串,前缀和(左括号表示1,右括号表示-1)为 j 的有几种. 状态转移很容易得到:dp[i][j]=dp[i - 1][j + 1]+dp[i - 1][j - 1],表示 i 这位分别放上右括号和左括号. 然后就是要处理题目的问题了: 我们可以枚举P串的长度和P串的前缀和,来看这种情况下是否符合题目要求,如果符合答案增加. 那么如何判断P串长度为left,前缀和为p的情况下,有几种符合题目要求呢? 先对已经存在的那个

codeforces 552 第一次能全做出来DIV2流下了感动的泪水....

#include <iostream> #include <cstdio> using namespace std; /*B*/ /*注意要开长整型.........没别的说的*/ /* int main() { long long int m; scanf("%lld",&m); if(m<10) {printf("%d\n",m);return 0;} long long int n=m; int q=0; while(n)