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会掉惨 (然而事实证明 ...
随机推荐
- C++ Compress Floder
第三方函数.头文件.测试工程下载地址:http://download.csdn.net/detail/u012958937/8361733
- CSS形变与动画
形变 2D形变 matrix(): 以一个含六值的(a,b,c,d,e,f)变换矩阵的形式指定一个2D变换,相当于直接应用一个[a,b,c,d,e,f]变换矩阵 translate(): 指定对象的2 ...
- 项目中同一个dll的x86和x64同时引用
<ItemGroup Condition=" '$(Platform)' == 'x86' "> <Reference Include="System. ...
- Spring batch的学习
Spring batch是用来处理大量数据操作的一个框架,主要用来读取大量数据,然后进行一定处理后输出成指定的形式. Spring batch主要有以下部分组成: JobRepository ...
- Spring编译AOP项目报错
警告: Exception encountered during context initialization - cancelling refresh attempt: org.springfram ...
- vs2010中自动给函数或者类加上注释宏模板
Sub AddFunComment() Dim DocSel As EnvDTE.TextSelection DocSel = DTE.ActiveDocument.Selection DocSel. ...
- 【Python】【元编程】【一】动态属性和特性
#19.1 使用动态属性转换数据"""#栗子19-2 osconfeed.py:下载 osconfeed.jsonfrom urllib.request import u ...
- C++:几种callable实现方式的性能对比
C++中几种callable实现方式的性能对比 前言 C++中想实现一个callable的对象,通常有四种方式: std::function:最common的方式,一般会配合std::bind使用. ...
- Cocos2d-x学习笔记(十一)动作
动作类Action是一切动作的祖先类.它有三个直接继承子类: FiniteTimeAction受时间限制的动作: Follow精灵跟随精灵的动作: Speed运动速度控制: 而FiniteTimeAc ...
- ubuntu server 多网卡
https://wenku.baidu.com/view/51fb15742f60ddccdb38a007.html