比较典型的树形DP题目,f[u][j][k]表示以点u为子树,经过 j 个陷阱的最大值,其中k=0表示从u点出发,k=1表示终点为点u。则转移方程为:f[u][j+is_rtap][k]=Max{ f[v][j][k] | v为u的儿子节点,0<=j<=m }。要分别对每颗子树求出最大值,枚举其中的两颗子树,一颗出,一颗进,更新最大值。要注意在更新k=0时的最大值是,j要从1开始遍历,因为如果当前u节点存在trap,而u中的其中一个子节点v没有trap,那么会使f[u][1][0]加上f[v][0][0]的值,而不满足题目中遇到满足的m后停止下来。
1 //STATUS:C++_AC_93MS_5540KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #include