vf

[LOJ#2743][DP]「JOI Open 2016」摩天大楼

折月煮酒 提交于 2019-12-06 09:38:17
题目传送门 DP 经典题 考虑从小到大把数加入排列内 如下图( \(A\) 已经经过排序): 我们考虑如上,在 \(i\) ( \(A_i\) )不断增大的过程中,维护上面直线 \(y=A_i\) 之下的部分的长度之和 于是我们定义 DP : \(f[i][j][k][h]\) 表示插入了前 \(i\) 个数,分成 \(j\) 段, \(y=A_i\) 之下的部分长度之和为 \(k\) ,并且选出了 \(k\) ( \(0/1/2\) )个边界(第 \(1\) 个或第 \(n\) 个)的方案数 注意这个 DP 中我们只需要保证每段是否在边界以及相邻两段之间有空位即可,不关心每段的实际位置 不难发现,从 \(f[i][j][k][h]\) 转移到 \(f[i+1]\) , \(k\) 的增量是固定的,即对于每个段的两端,将直线从 \(y=A_i\) 移到 \(y=A_{i+1}\) 时每端都会多出 \(A_{i+1}-A_i\) 的长度(边界除外),于是 \(f[i][j][k][h]\) 转移到 \(f[i+1]\) 时 \(k\) 的增量为 \((A_{i+1}-A_i)\times(2j-h)\) ,设其为 \(w\) 。下面讨论几种情况进行转移: (1)新建一段,这一段可以放在边界除外的任意 \(j+1\) 个空隙内: \[f[i+1][j+1][w][h]+=f[i][j]