cf935E
题解:
树形dp
要记录一个最小的,一个最大的
然后转移
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=;
int p,m,g[N*][],f[N*][],T[N*][],size[N*],num;
char s[N*];
int build(int x,int y)
{
if (x==y)
{
num++;
f[num][]=g[num][]=s[x]-'';
return num;
}
int l=;
for (int i=x;i<=y;i++)
{
if (s[i]=='(')l++;
if (s[i]==')')l--;
if (s[i]=='?'&&l==)
{
int l=build(x+,i-),r=build(i+,y-);
num++;
T[num][]=l;T[num][]=r;
size[num]=size[l]+size[r]+;
return num;
}
}
}
void dfs(int x)
{
if (!T[x][]&&!T[x][])return;
dfs(T[x][]);dfs(T[x][]);
int l=T[x][],r=T[x][];
if (p<m)
{
for (int i=;i<=p;i++)
for (int j=;j<=i;j++)
if (j<=size[l]&&i-j<=size[r])
g[x][i]=min(g[x][i],g[l][j]-f[r][i-j]);
for (int i=;i<=p;i++)
for (int j=;j<i;j++)
if (j<=size[l]&&i-j-<=size[r])
g[x][i]=min(g[x][i],g[l][j]+g[r][i-j-]);
for (int i=;i<=p;i++)
for (int j=;j<=i;j++)
if (j<=size[l]&&i-j<=size[r])
f[x][i]=max(f[x][i],f[l][j]-g[r][i-j]);
for (int i=;i<=p;i++)
for (int j=;j<i;j++)
if (j<=size[l]&&i-j-<=size[r])
f[x][i]=max(f[x][i],f[l][j]+f[r][i-j-]);
}
else
{
for (int i=;i<=m;i++)
for (int j=;j<=i;j++)
if (j<=size[l]&&i-j<=size[r])
g[x][i]=min(g[x][i],g[l][j]+g[r][i-j]);
for (int i=;i<=m;i++)
for (int j=;j<i;j++)
if (j<=size[l]&&i-j-<=size[r])
g[x][i]=min(g[x][i],g[l][j]-f[r][i-j-]);
for (int i=;i<=m;i++)
for (int j=;j<=i;j++)
if (j<=size[l]&&i-j<=size[r])
f[x][i]=max(f[x][i],f[l][j]+f[r][i-j]);
for (int i=;i<=m;i++)
for (int j=;j<i;j++)
if (j<=size[l]&&i-j-<=size[r])
f[x][i]=max(f[x][i],f[l][j]-g[r][i-j-]);
}
}
int main()
{
scanf("%s",&s);
scanf("%d%d",&p,&m);
memset(f,0x8f,sizeof f);
memset(g,0x3f,sizeof g);
int root=build(,strlen(s)-);
dfs(root);
printf("%d",f[root][min(p,m)]);
}
cf935E的更多相关文章
- 【学术篇】CF935E Fafa and Ancient Mathematics 树形dp
前言 这是一道cf的比赛题.. 比赛的时候C题因为自己加了一个很显然不对的特判WA了7次但找不出原因就弃疗了... 然后就想划水, 但是只做了AB又不太好... 估计rating会掉惨 (然而事实证明 ...
随机推荐
- 不明原因报错集中处理:Undefined
1, NSGenericException错误 Terminating app due to uncaught exception 'NSGenericException', reason: '*** ...
- ubuntu下交叉编译lftp
一.背景: lftp依赖于ncurses,readline和gnutls 二.准备工作 2.1交叉编译ncurses 2.1.1获取ncurses源码 wget ftp://ftp.invisible ...
- mysql 通过binlog 查看执行日志
环境:linux deepin15.7 mysql 5.7 1.开启binlog vim /etc/mysql/mysql.conf.d/mysqld.cnf 添加 log_bin = /var/ ...
- Educational Codeforces Round 57 (Rated for Div. 2)
我好菜啊. A - Find Divisible 好像没什么可说的. #include<cstdio> #include<cstring> #include<algori ...
- 关于java中的类的学习
设计模式应该牵扯到类的分布排列了,尽管现在我只能这么表达. 下面来自段帅发来的视频课程中的整理: 类与类之间的关系 每天进步一点点 类是java程序中最小组成单位,要理解后才可以更能理解类继承,重载, ...
- 【Coursera】Security Introduction -Ninth Week(1)
前言 Coursera 的 Internet History,Technology,and Security 进入最后一周的学习了,在这最后一周内,需要进行的内容是 public-key 公钥系统的讲 ...
- IL and 堆于栈
CIL的基本构成+CIL操作码速记表+CIL操作码大全速查 引用类型:引用类型存储在堆中.类型实例化的时候,会在堆中开辟一部分空间存储类的实例.类对象的引用还是存储在栈中. 值类型:值类型总是分配在它 ...
- python 命令行升级pip
import os import sys path = '"'+os.path.dirname(sys.executable)+'\\scripts\\pip" install - ...
- DataTable转化成实体对象
/// <summary> /// The data extension. /// </summary> public static class DataExtension { ...
- MongoDB(课时25 地理信息索引)
3.6.4 地理信息索引 地理信息索引分为两类:2D平面索引,2DSphere球面索引.在2D索引里面基本上能够保存的信息都是坐标,而且坐标保存的就是经纬度坐标. 范例:定义一个shop的集合 db. ...