WolfInZooDivOne

作者:叶珈宁

关键词:计数 DP 前缀和优化

题目简述

有一个长度为的序列,你需要给每个位置填上0或者1。现在给出个形如的限制,表示区间的和不能超过2。

问有多少种合法的序列。

.

算法

可以设计一个DP,用表示,最后一个1在位置,倒数第二个1的位置在的合法方案总数。

,则有

从左往右扫,可以用一个multiset维护所有区间的左端点,然后动态删去的那些区间,multiset里的最小值就是

因为转移的时候要询问前缀和,所以在DP做完一个的时候,做一遍前缀和来优化复杂度,DP的复杂度就可以做到

For(i,1,n){
        int t=*Set.begin();
        f[i][0]=1;
        rep(j,1,t)inc(f[i][j],f[j][j-1]);//临界点左边的情况
        rep(j,t,i)inc(f[i][j],f[j][t-1]);//临界点右边的情况
        rep(j,1,i)inc(f[i][j],f[i][j-1]);//前缀和优化
        inc(an,f[i][i-1]);//统计答案
        for(int x:li[i])Set.erase(Set.find(x));//删除右端点为i的线段
    }

而处理的复杂度可以做到,最后的总复杂度是

results matching ""

    No results matching ""