Fafa and Ancient Mathematics

转换成树上问题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 ;
} /*
*/

最新文章

  1. Android Studio--Gradle基础(转)
  2. HTML5 history API实践
  3. NSIS打包(一)常用概念简介
  4. .NET Remoting学习笔记(二)激活方式
  5. [转载] 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc),编写函数 strcpy(C++版)
  6. C语言中的各种修饰符
  7. swift 个人笔记
  8. ubuntu16安装KVM
  9. FMS用AS来实现拉流
  10. tp框架的详细介绍,tp框架基础
  11. 从Vue.js源码角度再看数据绑定
  12. JSP Servlet javaben
  13. Python实现Plugin(插件化开发)
  14. 错误不能中断(不许因错误或异常而产生阻断性Bug)
  15. linux RCU锁机制分析
  16. Java中 equals 和 == 的比较
  17. Clock skewdetected. Your build may be incomplete.
  18. [UE4]蓝图函数库小结
  19. Titel Block不显示
  20. windows下 安装python_ldap MySQL-python

热门文章

  1. ansible笔记(4):常用模块之文件操作
  2. centos系统初始化配置
  3. __dict__(字典的另一种用法)
  4. mac系统 安装 JDK 并配置环境
  5. ( linker command failed with exit code 1) 错误解决方案 项目使用的是pod
  6. mongodb基类封装实例
  7. Feign服务消费者
  8. java多线程快速入门(二十)
  9. LeetCode(108):将有序数组转换为二叉搜索树
  10. js 浮点数相加 变成字符串 解决方案