题解:

树形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. MAC下BurpSuit社区版升级pro版

    环境OSX 步骤1. 官网下载社区版v1.7.32https://portswigger.net/burp/communitydownload 安装 2. 下载keygenhttps://down.5 ...

  2. swift设计模式学习 - 策略模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 策略模式 策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. ...

  3. Luogu 2671 求和 NOIP2015T3

    题目链接 题解 20pts $O(n^3)$枚举$x,y,z$,根据题目要求判断 40pts $O(n^2)$枚举$x,z$,需要满足$x,z$奇偶相同 20~40pts的代码我都没有写过...就不贴 ...

  4. samtools一些文档

    https://github.com/samtools/hts-specs

  5. Servlet之javax.servlet包

    链接 : http://blog.sina.com.cn/s/blog_5d4214c70102wnf1.html

  6. Codeforces 839B - Game of the Rows

    839B - Game of the Rows 思路:先放4个的,然后再放2个的,最后再放1个的. 代码: #include<bits/stdc++.h> using namespace ...

  7. Java JDK5新特性-静态导入

    2017-10-31 00:10:50 静态导入格式:import static 包名 ...类名.方法名: 也就说可以直接导入到方法名. 注意: 方法必须是静态的 如果有多个同名的静态方法,容易不知 ...

  8. springboot 解决 The bean 'userRepository', defined in null, could not be registered. A bean with that name has already been defined in file XXX and overriding is disabled.

    1.springboot 启动时报错: 2019-02-20 14:59:58.226 INFO 10092 --- [ main] c.f.s.SpringbootssmApplication : ...

  9. jquery ajax中 php前台后台文件中编辑都是uft-8,返回数据还是乱码

    jquery ajax中 前台后台文件中编辑都是uft-8,返回数据还是乱码 解决如下: 在后台处理文件里面需要再加编辑 header("Content-Type:text/html;cha ...

  10. Java类和对象的概念

    Java是一门面向对象的编程语言,理解Java,首先要理解类与对象这两个概念. Java中的类可以看做C语言中结构体的升级版.结构体是一种构造数据类型,可以包含不同的成员(变量),每个成员的数据类型可 ...