CF935E Fafa and Ancient Mathematics

2023-11-08 06:21

本文主要是介绍CF935E Fafa and Ancient Mathematics,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题链接:http://codeforces.com/problemset/problem/935/E

Fafa and Ancient Mathematics

Ancient Egyptians are known to have understood difficult concepts in mathematics. The ancient Egyptian mathematician Ahmes liked to write a kind of arithmetic expressions on papyrus paper which he called as Ahmes arithmetic expression.

An Ahmes arithmetic expression can be defined as:

d d ” is an Ahmes arithmetic expression, where d is a one-digit positive integer;
(E1opE2) ( E 1 o p E 2 ) ” is an Ahmes arithmetic expression, where E1 E 1 and E2 E 2 are valid Ahmes arithmetic expressions (without spaces) and op o p is either plus ( + +  ) or minus ( ).
For example 5,(11) 5 , ( 1 − 1 ) and ((1+(23))5) ( ( 1 + ( 2 − 3 ) ) − 5 ) are valid Ahmes arithmetic expressions.
On his trip to Egypt, Fafa found a piece of papyrus paper having one of these Ahmes arithmetic expressions written on it. Being very ancient, the papyrus piece was very worn out. As a result, all the operators were erased, keeping only the numbers and the brackets. Since Fafa loves mathematics, he decided to challenge himself with the following task:

Given the number of plus and minus operators in the original expression, find out the maximum possible value for the expression on the papyrus paper after putting the plus and minus operators in the place of the original erased operators.

Input

The first line contains a string E(1|E|104) E ( 1 ≤ | E | ≤ 10 4 ) — a valid Ahmes arithmetic expression. All operators are erased and replaced with ‘?’.

The second line contains two space-separated integers P P and M (0min(P,M)100) ( 0 ≤ m i n ( P , M ) ≤ 100 ) — the number of plus and minus operators, respectively.

It is guaranteed that P+M P + M  =  the number of erased operators.

Output

Print one line containing the answer to the problem.

Examples
input

(1?1)
1 0

output

2

input

(2?(1?2))
1 1

output

1

input

((1?(5?7))?((6?2)?7))
3 2

output

18

input

((1?(5?7))?((6?2)?7))
2 3

output

16

Note

The first sample will be (1+1)=2 ( 1 + 1 ) = 2 .

The second sample will be (2+(12))=1 ( 2 + ( 1 − 2 ) ) = 1 .

The third sample will be ((1(57))+((6+2)+7))=18 ( ( 1 − ( 5 − 7 ) ) + ( ( 6 + 2 ) + 7 ) ) = 18 .

The fourth sample will be ((1+(5+7))((62)7))=16 ( ( 1 + ( 5 + 7 ) ) − ( ( 6 − 2 ) − 7 ) ) = 16 .

题目大意

给出一个算式,由括号和小于 10 10 的正整数和问号组成,问号是算式中的符号,现给出原式中加号的个数 p p 和减号的个数m,对于所有填放方式对应的结果,求最大值。

题解

这里要用到一种将算式转化为二叉树的技巧,每个叶子节点为算式的初始数值,非叶子节点则为运算符号,样例 2 2 转换出的二叉树如图所示:

1.png

这样转化成二叉树之后,我们就可以做树形dp了,最简单的思路就是用 dp[i][j][k][0/1] d p [ i ] [ j ] [ k ] [ 0 / 1 ] 表示对于第 i i 个点,它的子树中使用了j个加号, k k 个减号时子树运算式的最大/最小值。

但是,这种做法需要O(|E|×P×M)的空间,似乎开不下来,但是题目的数据范围 (0min(P,M)100) ( 0 ≤ m i n ( P , M ) ≤ 100 ) 似乎在暗示些什么。那么我们不妨把加号和减号的两维合并成一维,只记录数量较少的符号作为一维即可。

代码
#include<bits/stdc++.h>
#define ls son[v][0]
#define rs son[v][1]
using namespace std;
const int M=1e4+5;
int son[M][2],dad[M],dp[M][105][2],add,sub,len,minn,tot=1,pre=1;
char ch[M];
void build()
{len=strlen(ch+1),minn=min(add,sub);for(int i=1;i<M;++i)for(int j=0;j<=minn;++j)dp[i][j][0]=-1e9,dp[i][j][1]=1e9;for(int i=1;i<=len;++i)if(ch[i]=='('||ch[i]=='?')son[pre][son[pre][0]?1:0]=++tot,dad[tot]=pre,pre=tot;else if(ch[i]==')')pre=dad[pre];else dp[tot][0][0]=dp[tot][0][1]=ch[i]-'0',pre=dad[pre];
}
void dfs(int v)
{if(!ls)return;dfs(ls);dfs(rs);for(int i=0;i<=minn;++i)for(int j=0;i+j<=minn;++j)dp[v][i+j+(add<sub)][0]=max(dp[v][i+j+(add<sub)][0],dp[ls][i][0]+dp[rs][j][0]),dp[v][i+j+(add>=sub)][0]=max(dp[v][i+j+(add>=sub)][0],dp[ls][i][0]-dp[rs][j][1]),dp[v][i+j+(add<sub)][1]=min(dp[v][i+j+(add<sub)][1],dp[ls][i][1]+dp[rs][j][1]),dp[v][i+j+(add>=sub)][1]=min(dp[v][i+j+(add>=sub)][1],dp[ls][i][1]-dp[rs][j][0]);
}
void in(){scanf("%s%d%d",ch+1,&add,&sub);}
void ac(){build();dfs(1);printf("%d",dp[1][minn][0]);}
int main(){in();ac();}

这篇关于CF935E Fafa and Ancient Mathematics的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/368336

相关文章

用于资产定价的FAFA三因素模型的案例实现

一:FAFA三因素模型的介绍 FAFA三因素模型,即Fama-French三因子模型,是在1992年提出的资产定价模型。该模型是对传统的资本资产定价模型(CAPM)的扩展,它认为除了市场风险之外,还有其他两个因素对股票的预期收益率有重要影响,这两个因素是公司规模(Size)和账面市值比(Book-to-Market Ratio)。 Fama-French三因子模型的核心观点是,投资者在承担额外

【具体数学 Concrete Mathematics】1.1 递归问题 讲义

【具体数学 Concrete Mathematics】1.1 递归问题 导入 本节(1.1、1.1.1-1.1.3)主要围绕《具体数学》第一章 递归问题(Recurrent Problems)讲义部分的三个问题展开,分别是汉诺塔、平面上的直线以及约瑟夫问题。下面简单介绍一下递归问题和数学归纳法,做一个简单的导入,具体的递归应用可以在三个例子(1.1.1-1.1.3)中获得更好的体现: 1. 递

【具体数学 Concrete Mathematics】1.1.1 汉诺塔问题

【具体数学 Concrete Mathematics】1.1.1 汉诺塔问题 汉诺塔问题的设定是:给定一个由8个圆盘 1 − 8 1-8 1−8( 1 1 1号圆盘最小, 8 8 8号圆盘最大)和三根柱子 A , B , C A,B,C A,B,C,从上向下这些圆盘大小逐渐递减(即圆盘不能放在比自身小的圆盘上)放在柱子 A A A上。 问: 最少需要多少步能够将所有圆盘都转移到柱子 C C C

【具体数学 Concrete Mathematics】1.1.2 平面上的直线

【具体数学 Concrete Mathematics】1.1.2 平面上的直线

Codeforces 1C. Ancient Berland Circus(计算几何:正多边形性质+高精度)

给出三个点的坐标,输出含这三个点的最小正多边形面积 感觉这个题太牛逼了。。。 做的我元气大伤,昨晚看的题,一直没有思路 就去找了道类似的计算几何题Uva12300来做,做得还是挺顺手的 后来意识到了正多边形的一个性质:正n边形中一条边对应的圆心角为2×PI/n 以这里为突破口,先找出n的值,进而再求解 但有一个问题就是给定的点不一定相邻 也就是说两个点与圆心所对应的夹角有可能是多条边

The Charm and Influence of Mathematics

The Charm and Influence of Mathematics 目录 The Charm and Influence of Mathematics Translation  Respected Teachers and Dear Classmates: Hello everyone! Today, the two of us will join hands to l

POJ 2159 Ancient Cipher 杂题

题意:给定 str1, str2, 如果 str2 经过加密可以变成 str1。 输出YES,否则输出NO. 加密方式有两种,一种是改变字符,一种是调换顺序。 题解:这题还是耽搁了一会儿。一开始把题意理解错了,将substitution cipher (置换密码):当做按字典序偏移任意个位置。所以一直WR。 看了别人的解释: “substitution cipher (置换密码): S

How to Read Mathematics 如何阅读数学

This article is part of the book Rediscovering Mathematics, which is due out in early 2011. - Rediscovering Mathematics: Patriot Ledger How to Read Mathematics 如何阅读数学 Mathematics is “a language th

CodeForces 611D:New Year and Ancient Prophecy DP + lcp

传送门 题目描述 给一个n位数,要求将该n位数拆分成若干数字,且需满足: 数字的顺序要严格递增数字都是正整数没有前导零求所有可能的方案数 分析 这道题写了好几天了2333 首先如何判断两个A和B谁大谁小 首先,如果A长度大于B长度,A大于B,反之亦然 如果AB长度相同,那么比较他俩的最长公共前缀,如果等于AB的长度,说明A等于B,如果不等于,那么就比较最强公共前缀的下一位即可 我们用数

例题6-13 古代象形符号(Ancient Messages,World Finals 2011,UVa 1103)

原题链接:https://vjudge.net/problem/UVA-1103 分类:图 备注:思维 前言:说实话我确实自己写不出,写下面代码的时候对一下uDebug,不过我没有看作者代码了(早就看了好几遍了),相当于我把作者的代码默写了一下,以后可能很多题都要这样吧,但是能默写出来说明我也是有好好理解这代码是怎么写出来的。我看了作者代码挺久才懂的,不知道下面讲的算不算清楚,对于尚未理解题目的人