思路:
用一个二维数组存储下每个位置之前的所有的颜色的客栈个数(即前缀和), 并记录下每一个在限制范围内的客栈
以这些客栈为分割点, 将整个区间分为若干段(不包括分割点)
对于每个分割点, 统计它之前的区间与后面的一段的方案数, 对分割点单独统计, 这样便可以做到不重复也不遗漏统计
以下图作为例子(第二行为编号,第三行为颜色,第四行为费用):
其中, 2,5,7为限制范围内的客栈, 将客栈分为1~1,3~4,6~6,8~8四段
对第一个分割点2, 讨论1~4. 若不选2, 有1种方案; 若选2, 有1种方案
对第二个分割点5, 讨论1~6. 若不选5, 有2种方案; 若选5, 有3种方案
对第三个分割点7, 讨论1~8. 若不选7, 有4种方案; 若选7, 有2种方案
所以答案为13
下面是代码
代码:
1 |
|