给一个只有加号和乘号的表达式,要求添加一对括号使得最后结果最大。表达式长度5000,乘号最多12个,表达式中数字只有1位。

左括号一定在乘号右边,右括号一定在乘号左边,因为如果不是这样的话,一定可以调整括号的位置使表达式的值增大。

于是只要枚举括号的位置然后计算表达式即可。【以上来源,懒得自己写了】

做到这道题的时候突然发现自己忘记表达式求值怎么求了

这个表达式只有括号,加号和乘号

大概用到了后缀表达式的思想,但不会去真正化成后缀表达式

建两个栈,一个char类型,一个int类型

从左到右扫描,

如果是数,则直接压入int栈中

如果是'*'或者'(',则将其加入char栈中

如果是是')',则不断地将符号从char栈中取出来,直到遇到'(',最后在把'('弹出

每从char中取出一个元素,

从int栈中取出两个元素,进行相应的操作,然后重新放回int栈中。

当扫描完整个表达式后,如果char栈中还有符号,

不断地弹出弹出,操作同上。。

就这样:)

#include<bits/stdc++.h>
#define eps 1e-9
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define MAXN 1005
#define MAXM 40005
#define INF 0x3fffffff
#define PB push_back
#define MP make_pair
#define X first
#define Y second
#define lc (k<<1)
#define rc ((k<<1)1)
using namespace std;
typedef long long LL;
LL i,j,k,n,m,x,y,T,ans,big,cas,num,len;
bool flag; stack<char> tt;
stack<LL> an;
char ss[];
char s[]; LL calc(LL l,LL r)
{
LL i,j;
while (!tt.empty()) tt.pop();
LL nn=; while (!an.empty()) an.pop();
for (i=;i<len;i++)
{
if (i==r)
{
char c=tt.top();
while (c!='(')
{
LL u=an.top();an.pop();
LL v=an.top();an.pop();
if(c=='+') an.push(u+v);
else if (c=='*') an.push(u*v);
tt.pop();
c=tt.top();
}
tt.pop();
} if (s[i]=='*') tt.push(s[i]);else
if (s[i]=='+')
{
while (!tt.empty() && tt.top()=='*')
{
LL u=an.top();an.pop();
LL v=an.top();an.pop();
an.push(u*v);
tt.pop();
}
tt.push(s[i]);
}else
if (s[i]>='' && s[i]<='')
{
an.push(s[i]-'');
} if (i==l)
{
tt.push('(');
}
}
while (!tt.empty())
{
char c=tt.top();
LL u=an.top();an.pop();
LL v=an.top();an.pop();
if(c=='+') an.push(u+v);
else if (c=='*') an.push(u*v);
tt.pop();
} return an.top();
} vector<LL> mul; int main()
{
scanf("%s",s+);
s[]='';
s[]='*';
len=strlen(s);
s[len]='*';
s[len+]='';
s[len+]=;
len=strlen(s);
//printf("%s\n",s); mul.clear();
for (i=;i<len;i++)
{
if (s[i]=='*') mul.PB(i);
}
ans=;
for (i=;i<mul.size();i++)
{
for (j=i+;j<mul.size();j++)
{ LL tmp=calc(mul[i],mul[j]);
ans=max(ans,tmp);
}
}
printf("%I64d\n",ans);
return ;
}

Codeforces 552E - Vanya and Brackets【表达式求值】的更多相关文章

  1. codeforces 552 E. Vanya and Brackets 表达式求值

    题目链接 讲道理距离上一次写这种求值的题已经不知道多久了. 括号肯定是左括号在乘号的右边, 右括号在左边. 否则没有意义. 题目说乘号只有15个, 所以我们枚举就好了. #include <io ...

  2. Codeforces 552E Vanya and Brackets(枚举 + 表达式计算)

    题目链接 Vanya and Brackets 题目大意是给出一个只由1-9的数.乘号和加号组成的表达式,若要在这个表达式中加上一对括号,求加上括号的表达式的最大值. 我们发现,左括号的位置肯定是最左 ...

  3. CodeForces - 552E Vanya and Brackets

    Vanya and Brackets Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u ...

  4. CodeForces - 552E Vanya and Brackets —— 加与乘运算的组合

    题目链接:https://vjudge.net/contest/224393#problem/E Vanya is doing his maths homework. He has an expres ...

  5. CF552E 字符串 表达式求值

    http://codeforces.com/contest/552/problem/E E. Vanya and Brackets time limit per test 1 second memor ...

  6. 表达式求值(noip2015等价表达式)

    题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...

  7. 用Python3实现表达式求值

    一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...

  8. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  9. nyoj305_表达式求值

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

随机推荐

  1. liveReload

    依赖条件: 1.安装liveReload浏览器插件: http://livereload.com/extensions/ chrome可以直接去在线商店安装liveReload. P.S.也可以贴代码 ...

  2. PendingIntent的Flags

    PendingIntent是一个Intent的描述.包装,给予了这个PendingIntent 的组件在指定的事件发生或指定的时间到达时启动Activty.Service或者Broadcast. 根据 ...

  3. wireshark设置抓服务器的包

    wireshark设置抓服务器的包:

  4. 利用rowid更新单表

    SQL> create table test1(id int,name char(10)); Table created. begin for i in 1 .. 1000000 loop in ...

  5. Drools引擎学习

    首先上一段话: 为提高效率,管理流程必须自动化,即使现代商业规则异常复杂.市场要求业务规则经常变化,系统必须依据业务规则的变化快速.低成本的更新.为了快速.低成本的更新,业务人员应能直接管系统中的规则 ...

  6. 【转】如图,win7登陆界面,键盘失灵,没办法登陆。求解!如何在这个界面打开个鼠标可以点的软键盘

    原文网址:http://zhidao.baidu.com/link?url=URPzHJXt9_yhtE-2A89apKsn5Y1B9O2NR_mktkaHSOPbUWb7TKSIYJKj_-lYPn ...

  7. (转载)Mysql查找如何判断字段是否包含某个字符串

    (转载)http://www.th7.cn/db/mysql/201306/31159.shtml 有这样一个需求,在Mysql数据库字符串字段(权限)中,用户有多个不同的邮箱,分别被‘,’分开,现在 ...

  8. Unity3D学习笔记——选择Enemy

    一.步骤: 1.创建三个Cube,并将这三个Cube的Cube的Tag设为Enemy 2.导入第一人称视角的资源 3.创建名为Targeting的C#脚本 4.编写Targeting脚本,并将它附到第 ...

  9. ACM3787

    /* 问题说明 给定两个整数A和B,其表示形式是:从个位开始, 每三位数用逗号","隔开. 现在请计算A+B的结果,并以正常形式输出. 输入 输入包含多组数据数据,每组数据占一行, ...

  10. Java正则表达式(1)

    String类的三个内建正则表达式工具: 1.matches()方法 示例:检查一个句子是否以大写字母开头,以句号结尾 public static boolean checkFormat(String ...