Codeforces 935E Fafa and Ancient Mathematics dp
转换成树上问题dp一下。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = 1e4 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); char s[N];
int P, M, n, ans;
int mxdp[N][], mndp[N][], cnt[N];
int weight[N]; inline bool chkmax(int &a, int b) {
return a < b ? a = b, true : false;
}
inline bool chkmin(int &a, int b) {
return a > b ? a = b, true : false;
} int getPos(int l, int r) {
int w = , pos = -;
int digit = -;
for(int i = l; i <= r; i++) {
if(s[i] == '(') w += ;
else if(s[i] == ')') w -= ;
else if(s[i] == '?') weight[i] = w;
if(isdigit(s[i])) digit = i;
}
for(int i = l; i <= r; i++) {
if(s[i] == '?') {
if(pos == - || weight[pos] > weight[i]) pos = i;
}
}
if(~pos) return pos;
return digit;
} void dfs(int l, int r, int rt) {
if(s[rt] != '?') {
mxdp[rt][] = s[rt] - '';
mndp[rt][] = s[rt] - '';
return;
}
int ls = getPos(l, rt - );
int rs = getPos(rt + , r);
dfs(l, rt - , ls);
dfs(rt + , r, rs);
cnt[rt] = cnt[ls] + cnt[rs] + ;
if(P < M) {
for(int i = ; i <= cnt[ls]; i++) {
for(int j = ; j <= cnt[rs]; j++) {
if(i + j > P) continue;
if(P - i - j > ) {
chkmax(mxdp[rt][i + j + ], mxdp[ls][i] + mxdp[rs][j]);
chkmin(mndp[rt][i + j + ], mndp[ls][i] + mndp[rs][j]);
}
if(M - (cnt[ls] - i) - (cnt[rs] - j) > ) {
chkmax(mxdp[rt][i + j], mxdp[ls][i] - mndp[rs][j]);
chkmin(mndp[rt][i + j], mndp[ls][i] - mxdp[rs][j]);
}
}
}
} else {
for(int i = ; i <= cnt[ls]; i++) {
for(int j = ; j <= cnt[rs]; j++) {
if(i + j > M) continue;
if(M - i - j > ) {
chkmax(mxdp[rt][i + j + ], mxdp[ls][i] - mndp[rs][j]);
chkmin(mndp[rt][i + j + ], mndp[ls][i] - mxdp[rs][j]);
}
if(P - (cnt[ls] - i) - (cnt[rs] - j) > ) {
chkmax(mxdp[rt][i + j], mxdp[ls][i] + mxdp[rs][j]);
chkmin(mndp[rt][i + j], mndp[ls][i] + mndp[rs][j]);
}
}
}
}
} int main() {
scanf("%s", s + );
n = strlen(s + );
scanf("%d%d", &P, &M);
for(int i = ; i <= n; i++)
for(int j = ; j <= min(P, M); j++)
mxdp[i][j] = -inf, mndp[i][j] = inf;
int root = getPos(, n);
dfs(, n, root);
printf("%d\n", mxdp[root][min(P, M)]);
return ;
} /*
*/
Codeforces 935E Fafa and Ancient Mathematics dp的更多相关文章
- Codeforces 935E Fafa and Ancient Mathematics(表达式转树 + 树型DP)
题目链接 Codeforces Round #465 (Div. 2) Problem E 题意 给定一个表达式,然后用$P$个加号和$M$个减号填充所有的问号(保证问号个数等于$P + M$) ...
- CodeForces 935E Fafa and Ancient Mathematics (树形DP)
题意:给定一个表达式,然后让你添加 n 个加号,m 个减号,使得表达式的值最大. 析:首先先要建立一个表达式树,这个应该很好建立,就不说了,dp[u][i][0] 表示 u 这个部分表达式,添加 i ...
- 2018.12.12 codeforces 935D. Fafa and Ancient Alphabet(概率dp)
传送门 概率dp水题. 题意简述:给你数字表的大小和两个数列,数列中为0的数表示不确定,不为0的表示确定的,求第一个数列字典序比第二个数列大的概率. fif_ifi表示第i ni~ ni n位第一个 ...
- 【学术篇】CF935E Fafa and Ancient Mathematics 树形dp
前言 这是一道cf的比赛题.. 比赛的时候C题因为自己加了一个很显然不对的特判WA了7次但找不出原因就弃疗了... 然后就想划水, 但是只做了AB又不太好... 估计rating会掉惨 (然而事实证明 ...
- Codeforces 935D Fafa and Ancient Alphabet
题目链接 题意 给定两个\(n\)位的\(m\)进制数\(s1,s2\),所有出现的\(0\)均可等概率地被其他数字替换,求\(s1\gt s2\)的概率. 思路 从高位到低位,根据每一位上相应的\( ...
- [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)
[Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...
- [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】
[CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...
- [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)
[Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...
- Codeforces 611D New Year and Ancient Prophecy dp+字符串比较
这是CF Goodbye 2015 的D题,当时我想了一个n^3的dp算法,肯定不能过,然后听到学长后缀数组的n^2log(n)写法,仰慕 最后打完比赛看到了t神的n^2写法,简直膜拜,直接省去了后缀 ...
随机推荐
- Vue 介绍,优点,实例
一 认识vue 1.什么是vue 以数据驱动的web渐进式框架 三大主流框架: Angular React Vue 设计模式:MVVM 2.vue优点 - 以数据驱动,不直接操作DOM,效率高- 单页 ...
- IIS环境下部署https【转载】
1.首先我们要取走我们的证书,保存在我们本地的电脑里,然后复制到服务器即可. 2.取走后接下来干嘛?当然是打开文件看看里面有些什么啊.我们找到IIS那个压缩包并解压. 3.解析得到pfx文件,也就是我 ...
- Python-WEB -VUE初识
走进Vue_渐进式 JavaScript 框架 通过对框架的了解与运用程度,来决定其在整个项目中的应用范围,最终可以独立以框架方式完成整个web前端项目 what -- 什么是Vue 可以独立完成前后 ...
- Linux more和less
一.more命令 more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 ...
- 处理:“ORA-28002: the password will expire within 7 days”的问题
一:问题描述: 二:处理步骤 [oracle@localhost 2018_07_14]$ rlwrap sqlplus / as sysdba; SQL*Plus: Release 11.2.0.3 ...
- js去除空格12种方法
注:本文非本人原著:原文作者: 黄卉 <js去除空格12种方法> //JS去除空格的方法目前共有12种: //实现1 String.prototype.trim = function() ...
- Confluence 6 Cron 表达式
一个 cron 表达式是以 6-7 时间字段来定义一个计划任务是如何按照时间被执行的.每一个字段中的数据库而已为数字或者是一些特定的字符串来进行表达.每一个字段是使用空格或者 tab 进行分隔的. 下 ...
- Java的家庭记账本程序(F)
日期:2019.2.17 博客期:034 星期日 我先配置了Android的相关环境,先试着做了Hello World的测试,但是却出现了很严重的问题,问题如下: Unable to get curr ...
- Layers Of Caffe
本文试图描述构建一个网络结构的layers,可以用prototxt脚本直接写,也可以用python接口实现. 最简单的神经网络包含但不限于以下四部分: 数据层(Data): Data.ImageDat ...
- 课外知识----ini
ini 初始化英文单词的缩写,用来初始化参数 ini文件配置 [小节] 键=值 [小节] 键=值