标签:定义 line 根据 个数 它的 冗余 问题 max 一个
挺优秀的一道题,想出做法时感觉很惊艳。
数轴上有\(D\)个连续整数刻度,有\(N\)棵树要种在这些刻度上,其中第\(i\)棵与两旁(如果有的话)相邻的树至少要相距\(R_i\),问方法数。
\(1 \leq N , R_i \leq 40\)
首先,如果确定了种树的顺序,就确定了相邻树的最小间距。把\(D\)减掉最小间距之和,所得的就是“冗余刻度”的数量。
把这个数量分配给\(N+1\)段间隙,用插板法可以求出方法数。
所以问题在于,对于每一个\(L\),求出1到\(N\)的排列\(P\)的数量,满足:
\[\sum_{i=1}^{N-1} \mathrm{max}(R_i, R_{i+1})=L\]
注意到,对于使\(R_i\)最大的\(i\),它的两侧种的是什么树,不影响这两段间隙的最小长度。
根据套路,这个时候我们应该在\(i\)的位置把排列割开并分别处理。
对于一个1到\(N\)的子集的长度为\(l\)的排列\(P\),定义其代价为:\(\sum_{i=1}^{l-1} \mathrm{max}(R_i, R_{i+1})\)。
于是想到DP状态:\(dp[i][j][k]\)表示,1到\(i\)这\(i\)个数,组成了\(j\)个不相交排列,排列的代价总和为\(k\)的方法数。
转移时考虑第\(i\)个数在一个排列的两端还是中间,删除之并转移即可。
注意到\(i,j \leq 40\),\(k \leq 1600\),故复杂度没有问题。
标签:定义 line 根据 个数 它的 冗余 问题 max 一个
原文地址:https://www.cnblogs.com/turboboost/p/AppleTree.html