区间dp & CF2129D
区间dp & CF2129D
区间 dp 特征:
在解决大问题时可通过划分子区间缩小问题,再通过合并相邻子区间的答案得到总答案,即不同区间的答案具有 结合律 :
- 不同区间的答案选择不会相互干扰(后面的选择不会影响前面的);
- 不同子区间存在相互限制,但可通过把限制记录在状态内,从而使得限制在子区间合并时被满足。
CF2129D *2600
题意:
初始从左往右有 \(n\) 个白色单元格,对于一个长为 \(n\) 的排列 \(p_i\) ,在第 \(i\) 秒把单元格 \(p_i\) 染成黑色,于此同时对于离 \(p_i\) 最近的黑色单元格 \(x\) ( 如果有多个最近的黑色单元格,则选择索引最小的单元格),对于 \(x\) 的分数 \(s_x\) 加 \(1\) 。
现在给出得分序列 \(s\) ,其中 \(s_i=-1\) 表示未确定得分,计算可以产生此着色序列的不同排列 \(p\) 的数量,答案对 \(998244353\) 取模。
其中 \(n\le 100\) 。
思路:
该问题答案数较多,依次考虑排列 \(p\) 的每一位肯定不够现实。我们转换视角,考虑单元格上的染色顺序。对于一个单元格区间 \([l,r]\) ,可以发现当一侧已经染完色后,当出现新的染色时肯定不会越过这一侧对其他位置加分。
因此答案可以规约到一个个子区间中,考虑区间 \(dp\) ,可设 \(dp[l][r]\) 表示区间 \(l\sim r\) 已被染色的方案数。此时进一步考虑子区间中的染色情况,发现 \(l\sim r\) 中最先被染色的位置 \(k\) 一定会对该区间外的一个黑色单元格造成贡献,不满足我们上面所说的特征 \(1\) ,因此考虑能否记录该贡献位置会对哪一侧造成多少贡献。
因此设 \(dp[l][r][a][b]\) 表示区间 \(l\sim r\) 已被染色,对 \(l-1\) 的得分贡献为 \(a\) ,对 \(r+1\) 的得分贡献为 \(b\) 。转移考虑依次枚举区间 \(l\sim r\) 中最先被染色的位置 \(k\) ,从而可以考虑到 \(l\sim k-1\) 和 \(k+1 \sim r\) 是否能够使得位置 \(k\) 满足得分限制。因为我们只考虑了一段单元格区间内的染色顺序,未考虑在排列 \(p\) 中的位置,所以在子区间合并的时候要加入转移系数 $ \binom{r-l}{k-l}$ 。
综上所述,转移方程为
其中 \(w(l,r,k)\) 表示对于 \(k\) 会对位置 \(l-1\) 还是 \(r+1\) 做出加分。
初始化对于所有 \(s_i\le 0\) 的位置 \(dp[i][i][w(i,i,i)=i-1][w(i,i,i)=i+1]=1\) ,因为这些位置不受得分序列的限制。
答案即为 \(dp_{1,n,0,1}\) 。