Description
在幻想乡白玉楼有一棵终年不开花的樱树叫西行妖,西行寺幽幽子曾经为了让它开花而大量收集春度,然后被城管教训了一顿…
现在,幽幽子得到城管的允许,收集了S点春度,让西行妖重新开花。
西行妖可以被看成是一棵有n个节点的树,每个叶子节点被分配了1点春度就能开花(幽幽子不会无意义地使用她的春度,于是最多只会给同一个叶子节点分配1点春度),对于非叶子节点i,如果它有至少有1个儿子开花,那么节点i能开花。
据说,西行妖的花开满之时,幽幽子会复活。但是城管只给了S点春度(S≤20),所以幽幽子这次是抱着娱乐的心态种树的。
如果西行妖有至少m个节点开花,那么幽幽子认为它是美丽的。现在幽幽子想知道,有多少种方案,使西行妖是美丽的(答案对10^9+7取模)。
注意:幽幽子不一定会把S点春度都分配完。
100%: 1≤m≤n≤1000 1≤S≤20
Analysis
很容易想DP啊。
设
f[i][j][k]
表示按dfs序做到第i个叶子节点,用了j个春度,整棵树开了k朵花。
f[i][j][k]=∑i′<if[i′][j−1][k−dep[i]+dep[lca(i,i′)]]
可是这样是 O(n3S) 的,TLE。
但是,dp中有用状态很少,所以枚举当前状态转移到未来状态,若f[i][j][k]=0就显然没有贡献,可以快很多,强行碾过去了。