Born Slippy (超大背包问题 + 树形DP)
首先是需要我们知道的是假设又一条链给你让你求最大值,你会求吗?当然会,就是时间有点爆炸O(n2)。那不行,要是如果我把到达每个点的最大值以及他对后面的贡献情况都求出来后放在数组里面,然后到了新的节点直接查询该点的情况,但是问题就在于我们存进数组的时候遍历了O(1 << 16)那么时间还是不可以过,这时候需要使用大背包的想法,我们只把后面8为的结果打出来并存进数组,然后查询的时候只需要查询前8位,这样一来是不是时间就又优化到了允许的范围内了。还有就是我在树上面跑的时候会有重复的状况,就是两条链共用了同一套数据,那么只需要记录一下,然后回溯就可以便面这个问题了。
然后还有一个问题就是,我下载了数据,然后去跑一下,发现一个问题,就是我的电脑由于递归层数过多导致炸内存。所以就是买个大一点的内存可以更加为所欲为。
#include<bits/stdc++.h>
#define LL long long
using namespace std; const int mod = 1e9 + ;
const int maxn = ( << ) + ;
const int maxm = ( << ) + ;
vector<int>vec[maxn];
LL tmp[maxn][maxm], dp[maxm][maxm], w[maxn], ans;
int vis[maxm];
char str[]; int opt(int a, int b){
if(str[] == 'X') return a ^ b;
if(str[] == 'A') return a & b;
if(str[] == 'O') return a | b;
} void dfs(int rt){
LL ret = ;
LL a = w[rt] >> ;
LL b = w[rt] & ;
for(int i = ; i < ; i ++)
if(vis[i]) ret = max(ret, dp[i][b] + (opt(i, a) << )); ans = (1LL * rt * (ret + w[rt]) + ans) % mod;
vis[a] ++;
for(int i = ; i < ; i ++)
tmp[rt][i] = dp[a][i],
dp[a][i] = max(dp[a][i], ret + opt(b, i));
for(int i = vec[rt].size() - ; i >= ; i --)
dfs(vec[rt][i]);
for(int i = ; i < ; i ++)
dp[a][i] = tmp[rt][i];
vis[a] --;
} int main(){
int T,n,rt;scanf("%d",&T);
while(T --){
scanf("%d%s",&n, str);ans = ;
memset(dp, , sizeof(dp));
memset(vis, , sizeof(vis));
for(int i = ; i <= n; i ++)scanf("%lld",&w[i]),vec[i].clear();
for(int i = ; i <= n; i ++)scanf("%d",&rt),vec[rt].push_back(i);
dfs();printf("%lld\n",ans);
}
return ;
}
Born Slippy (超大背包问题 + 树形DP)的更多相关文章
- HDU 5735 Born Slippy(拆值DP+位运算)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5735 [题目大意] 给出一棵树,树上每个节点都有一个权值w,w不超过216,树的根为1,从一个点往 ...
- 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】
树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
- 动态规划——树形dp
动态规划作为一种求解最优方案的思想,和递归.二分.贪心等基础的思想一样,其实都融入到了很多数论.图论.数据结构等具体的算法当中,那么这篇文章,我们就讨论将图论中的树结构和动态规划的结合——树形dp. ...
- 树形dp专辑
hdu 2196 http://acm.hdu.edu.cn/showproblem.php?pid=2196 input 5//5个结点 1 1//表示结点2到结点1有一条权值为1的边 2 1//表 ...
- 杭电OJ——1011 Starship Troopers(dfs + 树形dp)
Starship Troopers Problem Description You, the leader of Starship Troopers, are sent to destroy a ba ...
- [SinGuLaRiTy] 树形DP专项测试
[SinGuLaRiTy-1015] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有的题目:Time Limit:1s | Me ...
- 树形dp 入门
今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...
- hdu 5735 Born Slippy 暴力
Born Slippy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5735 Description Professor Zhang has a r ...
随机推荐
- ubuntu安装jupyter 并设置远程访问
Jupyter Notebook是一个Web应用程序,允许您创建和共享包含实时代码,方程,可视化和说明文本的文档. 简单的介绍就是:Jupyter Notebook是Ipython的升级版,而Ipyt ...
- eslint 在VSCode中不能使用
在VSCode中安装号eslint插件,还是不能使用,还需安装 npm install eslint-plugin-promise --save-dev 我也不知道为什么?我现在只是用两天不到vsco ...
- mysql创建计算列(5.7以后才有)
mysql创建计算列 mysql> create table t(id int auto_increment not null,c1 int,c2 int,c3 int as (c1+c2) ...
- netstat 查看端口
-l 仅列出有在监听(listen)的服务状态 -n 拒绝显示别名,能显示数字的全部转化成数字 -p 显示建立相关链接的程序名 -t 仅显示 tcp 相关选项 -u 仅显示 udp 相关选项 -a 显 ...
- [Android][Android Studio] Gradle项目中加入JNI生成文件(.so文件)
版权声明:本文作者:Qiujuer https://github.com/qiujuer; 转载请注明出处,盗版必究! ! ! https://blog.csdn.net/qiujuer/articl ...
- MACD:黄白线、红绿柱与0轴关系
一.MACD的基本问题: (1)参数:统一用12,26,9 (2)MACD 位正.位不正原则 以下四种情况是黄白线.红绿柱与0轴关系的完全分类,行情出不了这四种情况, 即便黄白线在0轴单边反复缠绕 ...
- pycharm的小问题之光标
一大早起来,突然发现pycharm的光变粗,按退格键会删除编写的内容,超级难受(如下图), 百度一下,也不知道在百度框里输什么关键字好,但最后还是找到了,哈哈.... 解决方法: 1.按键盘上In ...
- cordava打包vue项目成app
注意:安装目录不要以中文命名 1.安装cordova :npm install -g cordova 2.安装java jdk :配置环境变量: 1.系统变量:名:JAVA_HOME 值:C:\ ...
- 虚拟主机是设置在httpd-vhosts.conf还是vhosts.conf还是httpd.conf
https://blog.csdn.net/weisubao/article/details/43536723 解决方案:虚拟主机是设置在httpd-vhosts.conf还是vhosts.conf还 ...
- Pycharm增加新安装Python的路径
Pycharm默认的Python是python2,但是如果代码是python3写的,就需要在pycharm里的project interpreter增加python3 注意,一定要找到Project ...