题解:

树形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的更多相关文章

  1. 【学术篇】CF935E Fafa and Ancient Mathematics 树形dp

    前言 这是一道cf的比赛题.. 比赛的时候C题因为自己加了一个很显然不对的特判WA了7次但找不出原因就弃疗了... 然后就想划水, 但是只做了AB又不太好... 估计rating会掉惨 (然而事实证明 ...

随机推荐

  1. Python3基础 os listdir 列举指定的所有文件及文件夹的名字

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  2. python分享题目

    目前的分享题目:1 python在云计算虚拟教室领域的应用 2 python与虚拟货币(华三工程师) 3 python在移动游戏的实践(爪子) 4 python互联网敏捷运维实践(蓝雪) 5 pyth ...

  3. 推荐一个SAM文件中flag含义解释工具--转载

    SAM是Sequence Alignment/Map 的缩写.像bwa等软件序列比对结果都会输出这样的文件.samtools网站上有专门的文档介绍SAM文件.具体地址:http://samtools. ...

  4. Linux下wget下载整个FTP目录(含子目录)--转载

    wget -nH -m --ftp-user=your_username --ftp-password=your_password ftp://your_ftp_host/* 解释:-nH:不创建以主 ...

  5. 【Python】【 接口自动化测试】【一】环境搭建

    1. 环境配置 我电脑Windows7 64位  +  Python2.7  + Oracle客户端 10.2 + cx_Oracle 10g Oracle客户端下载(为此我还申请个Oracle账号) ...

  6. Linux(CentOS 6.5) 下安装MySql 5.7.18 二进制版本粗浅攻略

    鉴于Linux和mysql因不同版本,安装方式也不同,所以在阅读本攻略前,请确保各位同学的版本和我的Linux.MySql 版本一致. 如果不一致,只能参考. 我的版本: Linux CentOS 6 ...

  7. go 字符串拼接

    s := "hello," m := " world" a := s + m fmt.Printf("%s\n", a)

  8. [ios]ios读写文件本地数据

    参考:http://blog.csdn.net/tianyitianyi1/article/details/7713103 ios - Write写入方式:永久保存在磁盘中.具体方法为:第一步:获得文 ...

  9. Object.defineProperty方法 使用

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 语法: Object.defineProperty(obj, pr ...

  10. C# int.ToString() 常用参数说明

    C#中int类型的ToString()方法有个重载是输入一个字符串,这个字符串可以对int进行部分格式化操作,如上.