[POI2015]MYJ
Description
给定 \(m\) 个区间,贡献就是区间内小于等于 \(c_i\) 的元素的最小值,不存在就是零。需要钦定每个点的值,最大化贡献和,输出方案。
Solution
最后的每个数的值只会是 \(c_i\) 中的某一个,所以对 \(c\) 离散化。而贡献又和区间有关,不好搞,但好在总区间很小,所以可以考虑区间 dp。\(dp[l][r][k]\) 表示只考虑是 \([l,r]\) 的子集的区间,且区间最小值是 \(k\) 的最大贡献和。转移的话可以枚举最小值的位置,贡献就是跨过该点且 \(c\) 大于等 \(k\) 的区间个数再乘上 \(k\)(这一点其实是分治的思想,只考虑跨过中点的元素的贡献,然后剩下的进行递归)。记录一下后缀最大值可以快速转移,\(O(n^3m)\)。
输出方案的话,考虑记下从哪儿转移来的。需要注意“从哪儿转移来的”的初始化,否则贡献都是零的话就会出错。