http://codeforces.com/gym/101908/problem/F
刚刚做了这个题,感觉有点套路,也有点烦。记一下解题的思路(其实是觉得这么水的题都做了这么久,有点过意不去)
题目大意:
给N组(N <= 10)有权值的区间,一共不超过1000个区间。在这些区间里选择若干不重叠(左右端点可以重)的区间,使得
1. N组里面每一组至少选一个区间
2.区间权值和最大
输出最大的权值和,如果找不到这样的区间集合,输出-1
解题思路:
离散化一下时间,一共有2000个时间点,记DP[i][j]表示在时间点 i ,状态为 j 的情况下能够取得的最大权值和。状态 j 是用N位2进制表示每一组是否选过,也就是说最多有1024种取值。
然后根据1000个区间作为物品来更新DP值。将区间按照左端点排序的话,每个区间能够更新DP[ 区间右端点 ][j],最多1024个值。这样可以在区间左端点之前的DP值里面找一个最大的来更新。这样需要查询区间的最大值,可以用1000个线段树来维护。
但是上面的做法我不想写。
于是枚举i,枚举j ,把DP[i][j]这个DP值取一个 “它” 与 “状态 j 的历史最大值” 的最大值,