Atcoder abc234
https://atcoder.jp/contests/abc234/tasks
G - Divide a Sequence
长n数组A
2^{n-1}种方式切割成非空顺序数字
f(切割) = $\prod$每个子数组的 (max-min)
求 $\sum$ f(所有切割)
mod 998244353
范围
2s 1024mb
我的思路
dp搞一搞
考虑最后一个数组长度
dp[i] = dp[i-len] * ((max-min)([i-len+1..i]))
但这样就O(n) 状态, n^2转移了
然后,算的时候,max和min可以拆开, 但是如果 两两不等的话, 即使用了 区间sum dp * max, 也可能max需要一个一个枚举,也是n^2
问题变成说
dp[i] = sum max(a[i-len+1..i]) * dp[i-len] - min(a[i-len+1..i]) * dp[i-len]
考虑相邻转移
i-1: sum max(a[j+1..i-1]) * dp[j]
a[i]是[j+1..i]的最大值
, 那么找最小的j
, 这之家你的贡献 = a[i] * sum dp[j..i-1]a[i]不是[j+1..i]
的最大值, 那么这贡献= sum max(a[j+1..i])*dp[j] = sum max(a[j+1..i-1])*dp[j]
因此相邻的dp虽然没有直接关系, 但是可以利用上次的计算
dp[i] = a[i] * sum(dp[j..i-1]) + sum f(0..j)
min同理
似乎就没了