码迷,mamicode.com
首页 > 移动开发 > 详细

SRM489 Div1 1000pts:AppleTree

时间:2018-06-17 16:51:26      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:定义   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\),故复杂度没有问题。

SRM489 Div1 1000pts:AppleTree

标签:定义   line   根据   个数   它的   冗余   问题   max   一个   

原文地址:https://www.cnblogs.com/turboboost/p/AppleTree.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!