CF552E 字串 表示式求值
http://codeforces.com/contest/552/problem/E
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.
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.
In the first line print the maximum possible value of an expression.
3+5*7+8*4
303
2+3*5
25
3*4*5
60
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).
/**
CF552E 字串 表示式求值
題目大意:給定一個字串只是做1~9之間的加法和乘法,現在在表示式中加上一對括號,問如何加才能使表示式的值最大
解題思路:左括號必須在一個*的後面,右括號必須在一個*的前面,如果不是這樣一定不是最優。有了這個結論,分成三部分算一下就可以了
*/
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
typedef long long LL;
char s[5005];
int n,a[105];
LL get(int l,int r)
{
LL ans=0,tmp=1;
for(int i=l;i<=r;i++)
{
if(isdigit(s[i]))
{
tmp*=s[i]-'0';
}
if(s[i]=='+')
{
ans+=tmp;
tmp=1;
}
}
ans+=tmp;
tmp=1;
LL sum=0;
for(int i=0;i<n;i++)
{
if(i==l)
{
tmp*=ans;
i=r;
}
else
{
if(isdigit(s[i]))
{
tmp*=s[i]-'0';
}
if(s[i]=='+')
{
sum+=tmp;
tmp=1;
}
}
}
sum+=tmp,tmp=1;
// printf(">>>%d %d %d %d\n",l,r,ans,sum);
return sum;
}
int main()
{
scanf("%s",s);
n=strlen(s);
int k=0;
a[k++]=0;
for(int i=0;i<n;i++)
{
if(s[i]=='*')
{
a[k++]=i-1;
a[k++]=i+1;
}
}
if(a[k-1]!=n-1)
a[k++]=n-1;
LL maxx=0;
for(int i=0;i<k;i++)
{
for(int j=i;j<k;j++)
{
LL t=get(a[i],a[j]);
maxx=max(maxx,t);
}
}
printf("%lld\n",maxx);
return 0;
}
相關文章
- 3.2.5 表示式求值
- Java表示式求值引擎 - AviatorJava
- 中綴表示式轉化為字尾表示式並求值
- Leetcode——150. 逆波蘭表示式求值LeetCode
- LeetCode-150- 逆波蘭表示式求值LeetCode
- 逆波蘭表示式求值 golang VS pythonGolangPython
- 逆波蘭表示式求值——棧與佇列佇列
- 力扣-150. 逆波蘭表示式求值力扣
- 利用 Lambda 表示式實現 Java 中的惰性求值Java
- 一種簡易的表示式求值演算法演算法
- 利用Lambda表示式進行Java中的惰性求值Java
- 使用棧實現表示式求值,運用棧計算
- 算數表示式求值--c語言課程設計C語言
- PostgreSQL 原始碼解讀(164)- 查詢#84(表示式求值)SQL原始碼
- 字串——正規表示式匹配字串
- 4、逆波蘭表示式求值——棧(java資料結構)Java資料結構
- .NET實現解析字串表示式字串
- 正規表示式中 “$” 並不是表示 “字串結束字串
- Java公式:如何執行字串表示式?!Java公式字串
- android 將字串轉成算術表示式Android字串
- 資訊學奧賽複賽複習09-CSP-J2020-03表示式求值前置知識點-中綴表示式求值、摸運算、模運算性質、棧
- 正規表示式的字串替換方法字串
- 【正規表示式】常用的正規表示式(數字,漢字,字串,金額等的正規表示式)字串
- LeetCode 之 JavaScript 解答第150題 —— 逆波蘭表示式求值(Evaluate Reverse Polish Notation)LeetCodeJavaScript
- 【棧】【字串語法】牛牛與字尾表示式字串
- 正規表示式刪除字串兩端空格字串
- 演算法之字串——正規表示式匹配演算法字串
- 正規表示式提取指定字元之間字串字元字串
- VirtualView iOS 簡易字串表示式的實現ViewiOS字串
- Javascript函式引數求值——Thunk函式JavaScript函式
- C#字尾表示式解析計算字串公式C#字串公式
- 匹配不包含字母的字串的正規表示式字串
- Python正規表示式匹配字串中的數字Python字串
- 正規表示式刪除字串兩邊的空格字串
- 正規表示式刪除字串中的漢字字串
- 前端菜鳥的每週一道演算法題(一) - 逆波蘭表示式求值前端演算法
- PAT6-2 多項式求值
- 字串值提取工具-10-java 執行表示式引擎字串Java
- 利用正規表示式提取固定字元之間的字串字元字串