这道题几经波折啊。

最开始和vfleaking一样,把题意理解错了,认为一个装备可能被多个装备依赖,然后想不出来,去看题解。

发现自己理解错了题意,自己想想,其实也不难想到dp[i][j][k]表示“i号节点代表的子树,用掉j的钱,给父亲预留k个自己(但还是父亲付钱)”的状态,写出来交上去就是T,

开始以为是常数问题,优化半天还是T,看了他人AC代码,才发现自己算法有一定问题:重复计算了很多东西。

树形动规,一般在大的树规下,每个节点还会对儿子们来一次”资源分配“,一般是用背包解决,这道题也是这样,但又有一点不一样,就是我们也要给该子树的根节点本身分配资源,

我就是这儿重复计算了,对于所有儿子的同一k,我算了多次。

 /**************************************************************
Problem: 1017
User: idy002
Language: C++
Result: Accepted
Time:16524 ms
Memory:48316 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <vector>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define maxn 55
#define maxm 2010
#define maxl 110
#define oo 0x3f3f3f3f
using namespace std; int n, m;
int indgr[maxn];
int power[maxn], cost[maxn], limit[maxn];
int head[maxn], next[maxn], dest[maxn], wght[maxn], tot; int dp[maxn][maxm][maxl];
int ep[maxm]; void insert( int a, int b, int w ) {
tot++;
wght[tot] = w;
dest[tot] = b;
next[tot] = head[a];
head[a] = tot;
}
void dfs( int i ) {
if( !head[i] ) return;
cost[i] = ;
limit[i] = oo; for( int t=head[i]; t; t=next[t] ) {
int s = dest[t], w = wght[t];
dfs( s );
cost[i] += cost[s]*w;
limit[i] = min( limit[i], limit[s]/w );
}
} void dodp( int i ) {
if( !head[i] ) {
for( int l=; l<=limit[i]; l++ )
for( int k=l; k>=; k-- ) {
int self = (l-k);
int j = self*cost[i];
if( j>m ) break;
dp[i][j][k] = self*power[i];
}
return;
}
for( int t=head[i]; t; t=next[t] )
dodp( dest[t] );
for( int l=; l<=limit[i]; l++ ) {
for( int j=; j<=m; j++ ) ep[j]=;
for( int t=head[i]; t; t=next[t] ) {
int v = dest[t], w = wght[t];
int vl = l*w;
for( int j=m; j>=; j-- )
for( int jj=; jj<=j; jj++ )
ep[j] = max( ep[j], ep[j-jj]+dp[v][jj][vl] );
}
for( int j=; j<=m; j++ )
for( int k=l; k>=; k-- ) {
int self = l-k;
int remain = j- self*cost[i];
if( remain< ) break;
dp[i][j][k] = max( dp[i][j][k], ep[remain]+self*power[i] );
}
}
} int main() {
scanf( "%d%d", &n, &m );
for( int i=; i<=n; i++ ) {
char type[];
scanf( "%d%s", power+i, type );
if( type[]=='A' ) {
int cnt;
scanf( "%d", &cnt );
for( int t=,c,w; t<=cnt; t++ ) {
scanf( "%d%d", &c, &w );
insert( i, c, w );
indgr[c]++;
}
} else
scanf( "%d%d", cost+i, limit+i );
}
int root = ;
for( int i=; i<=n; i++ )
if( indgr[i]== ) {
root = i;
break;
}
memset( dp, , sizeof(dp) );
dfs(root);
dodp(root);
int ans = ;
for( int j=; j<=m; j++ ) ans = max( ans, dp[root][j][] );
printf( "%d\n", ans );
}

bzoj 1017 tree dp的更多相关文章

  1. bzoj 2212 Tree Rotations

    bzoj 2212 Tree Rotations 考虑一个子树 \(x\) 的左右儿子分别为 \(ls,rs\) .那么子树 \(x\) 内的逆序对数就是 \(ls\) 内的逆序对数,\(rs\) 内 ...

  2. 96. Unique Binary Search Trees (Tree; DP)

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  3. HDU 4359——Easy Tree DP?——————【dp+组合计数】

    Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  4. TYOI Day1 travel:Tree dp【处理重复走边】

    题意: 给你一棵树,n个节点,每条边有长度. 然后有q组询问(u,k),每次问你:从节点u出发,走到某个节点的距离mod k的最大值. 题解: 对于无根树上的dp,一般都是先转成以1为根的有根树,然后 ...

  5. HDU 4359 Easy Tree DP?

    Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  6. bzoj 1017: [JSOI2008]魔兽地图DotR【树形dp+背包】

    bzoj上是一个森林啊--? dp还是太弱了 设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值 其实这个状态设计出来 ...

  7. BZOJ 1017 魔兽地图DotR(树形DP)

    题意:有两类装备,高级装备A和基础装备B.现在有m的钱.每种B有一个单价和可以购买的数量上限.每个Ai可以由Ci种其他物品合成,给出Ci种其他物品每种需要的数量.每个装备有一个贡献值.求最大的贡献值. ...

  8. BZOJ.1017.[JSOI2008]魔兽地图(树形DP 背包DP)

    题目链接 树形DP,考虑子节点对父节点的贡献. 设f[x][i][j]表示当前为x,用i个x去合成上一层装备,花费为j的最大价值. 由子节点转移时 是一个分组背包,需要一个辅助数组g[i][j]表示前 ...

  9. BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...

随机推荐

  1. 配置node,sass,淘宝镜像环境

    由于最近由于刚到手一台新的thinkpad(哈哈,宝宝是个小穷B,木有小苹果),所以工作开发中所用到的环境就需要重新安装一下啦,这里的话,我就把我目前所用到的进行总结一下,其余的会在以后的开发过程中, ...

  2. JavaScript 使用闭包保护变量 防止污染

    使用JavaScript编写插件或团队协作时,可使用闭包来解决此类以下两个问题: 1.定义过多全局变量,可能会造成全局变量命名冲突: 2.在插件内定义变量,需要保护该变量不被轻易修改: 优点:可以把局 ...

  3. 蓝色简单的cms文档管理系统模板——后台

    链接:http://pan.baidu.com/s/1qYMwHis 密码:xyiw

  4. 全面了解 Nginx 主要应用场景

    前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得.所以还请见谅,同时欢迎留言交流 N ...

  5. Spring Cloud Feign 输出日志

    还需要在application 文件中配置: #feign调用日志输出logging.level.cn.XXX=DEBUG Logger.Level下面有几种级别. BASIC : 只输出 请求URL ...

  6. [ JS 进阶 ] Repaint 、Reflow 的基本认识和优化

    你是不是经常听师兄或一些前端前辈说不能用CSS通配符 *,CSS选择器层叠不能超过三层,CSS尽量使用类选择器,书写HTML少使用table,结构要尽量简单-DOM树要小....等这些忠告,以前我就大 ...

  7. java.lang.reflect.UndeclaredThrowableExceptionjiang

    实例包含由调用处理程序抛出的经过检查的未声明异常,可以使用 getUndeclaredThrowable() 方法获取 String msg = null; if (e instanceof Unde ...

  8. centos 下tomcat 自动启动

    1.修改start.sh文件 vim /usr/local/tomcat8/bin/startup.sh 在文件头增加以下内容: #!/bin/sh # chkconfig: 2345 97 00 # ...

  9. python中调用cmd

    1. 使用os.system("cmd") 这是最简单的一种方法,特点是执行的时候程序会打出cmd在linux上执行的信息.使用前需要import os. os.system(&q ...

  10. Validating a Model