P16416 【MX-X28-T5】「FAOI-R12」单人旅行
一开始没理解其他题解的意思,最后终于明白了,感觉也是不难的,写篇题解补充一点。
首先考虑 \(t\) 在每次操作的时候会怎么样子,肯定都是成这样的值域:对于前 \(i\) 个数,这堆数都是在 \([1,i]\) 这个值域里面的,然后空着 \(i+1\) 因为连续的 \(c\) 的限制导致的,后面就是 \([i+2,j]\) 的值域了。
那么考虑 \(f_{i,j}\) 表示已经构成了 \([1,i]\) 了,且有 \(j\) 个连续,这个连续的意思是:例如填 \([l,r]\) 的时候我们先填 \([l+1,r]\) 然后再填 \(l\),是 \(c\) 的意义上的连续,分成了 \(j\) 段。
然后转移的时候并不好转移,因为那个不一样的 \(c\) 不确定,所以直接减去这个方案也就是容斥掉,那么这个 \(f_{i,j}\) 就能做出来了。
可能数组定义有点不一样吧。
::::success[Part]
f[l][r] 就是 [l,r] 操作的**连续**产生的价值
rep(i, 0, n - 1) rep(j, 0, i)
rep(k, i + 1, min(n, i + tot[i + 1] + 1))
(dp[k][j] -= 1ll
* dp[i][j]
* P(tot[i + 1], k - i) % mod
* f[i + 1][k] % mod) %= mod,
(dp[k][j + 1] += 1ll
* dp[i][j]
* P(tot[i + 1], k - i - 1) % mod
* f[i + 1][k] % mod) %= mod;
::::
最后统计答案的时候也是好做的。
::::success[\(\mathscr{Code:}\)]
看别人的吧。
::::

浙公网安备 33010602011771号