2018年7月25日暑假训练日记

上午:树形dp:

HDU 3452树形DP

题目大意:最简单的求树上的割权值和最小

状态转移:dp[i]+=min(w[i],dp[j]);也就是判断是在这个点割断好还是在下面的点割断好

Hdu 4616 树形DP

题目大意:求一棵树上经过k个雷停止的路径所能得到的最大权值。

状态转移:dp[u][j+c[u]][1] = max2(dp[u][j+c[u]][1],dp[v][j][1]+val[u]);
 dp[u][j+c[u]][0] = max2(dp[u][j+c[u]][0],dp[v][j][0]+val[u]);

也就是经过点v的时候已经踩了j个雷,且v点有无雷对u点的状况影响

Hdu 2415 树形DP

题目大意:求获得最少k张选票所需要的最小价值,其中如果买了根节点,那么就可以得到子节点全部的选票

状态转移:dp[u][i]=min(dp[u][i],dp[u][i-j]+dp[x][j]);

并特殊处理买根节点的状况:dp[u][num]=min(dp[u][num],val[u]);

由于选票的来源没有限制,所以在树上做了一个背包,包的上限为国家数目的总和,这里如果设为选票上限则不对,因为可以得到更多的选票而花更少的钱。

Hihocoder 1714 : 部门聚会 树形 DP

题目大意:有根节点,叶子节点取权值一半,问最大和

状态转移:dp[x] += max(dp[y], dpin[y])

dpin[x] += max(dp[y], dpin[y] - a[y] / 2);

其实就是两个状态,来与不来,dpin就是来,dp就是不来,很显然,不来可以获得下级的两种状态,来了叶子节点的值要减去一半

简单总结:目前看过的树形dp都应该算是入门性质的,但最终目的是看懂多校相关题目的题解。简单分一下类,可以分为

树上路径形式dp:树上不可回退路径+非状态记录:状态只与子节点有关,dfs后按照转移方程dp

  树上不可回退路径+状态记录:一般加一维来维护,每次递归回朔的时候用for循环枚举

树上可回退路径:两次dfs,一次让路径不可回退,第二次整合路径

树上非路径形dp+状态记录:需要在树上做背包整合状态

下午:1004莫名其妙的有人交了cout<<yes<<endl;就过了,很迷

1010也是没道理的求了逆序数就过了,然后一直在想1007,三个半小时的时候头有点晕就回去睡了会,路上想到了个思路就是线段树存b,区间更新找最小值,暴零更新对应位置,在对应树状数组位置add1,保存sum,然后查询log,更新查0可能时间复杂度大,但是是单点复杂度,由于b比较特殊,所以不可能同时暴零,于是就发给了队友,之后说的思路完全正确,安逸凡用了个dfs找到了0,这个就很厉害了。那个hack it只是跟着玩了一下,并没看出来分块。

猜你喜欢

转载自blog.csdn.net/m0_37772713/article/details/81208917
今日推荐