给一个只有加号和乘号的表达式,要求添加一对括号使得最后结果最大。表达式长度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. jQuery遍历对象、数组、集合实例

    1.jquery 遍历对象 复制代码代码如下:   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ...

  2. JavaScript中url 传递参数(特殊字符)解决方法

    有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码 十六进制值1. + URL 中+号表示空格 %2B2. 空格 UR ...

  3. 在linux中使用php将word文档转为pdf

    使用本教程需要在linux中安装openoffice,改页面中有详细的安装与使用教程(http://www.cnblogs.com/sustudy/p/3999628.html). 既然,你看了该教程 ...

  4. 双缓冲技术(Double Buffering)(1、简介和源代码部分)

    这一节实在是有些长,翻译完后统计了一下,快到2w字了.考虑到阅读的方便和网络的速度,打算把这节分为5个部分,第一部分为双缓冲技术的一个 简介和所有的代码,如果能够看懂代码,不用看译文也就可以了.第二部 ...

  5. spring 动态数据源

    1.动态数据源:  在一个项目中,有时候需要用到多个数据库,比如读写分离,数据库的分布式存储等等,这时我们要在项目中配置多个数据库. 2.原理:   (1).spring 单数据源获取数据连接过程: ...

  6. Linux硬链接与软连接

    1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节 ...

  7. 14.8.3 Physical Row Structure of InnoDB Tables InnoDB 表的物理行结构

    14.8.3 Physical Row Structure of InnoDB Tables InnoDB 表的物理行结构 一个InnoDB 表的物理行结构取决于在创建表指定的行格式 默认, Inno ...

  8. Linux os

    进程就是处于执行期的程序(目标代码存放在某种存储介质上,如内存).进程不只局限于可执行代码,还包括其他资源:打开的文件,挂起的信号,内核数据结构,内存地址空间以及至少一个执行线程. 进程是出于执行期的 ...

  9. bzoj2131

    首先不难想到对t排序,有f[i]=max(f[j])+v[i] tj<=ti且abs(pi-pj)/2<=ti-tj;要想优化,肯定从优化转移入手先去绝对值,当pi>=pj时,可得2 ...

  10. asp.net生成二维码的方法

    asp.net生成二维码的方法 [复制链接]     这个要利用一个Dll文件. 如下 Gma.QrCodeNet.Encoding.dll (105.5 KB, 下载次数: 27) 当然大家也可以直 ...