1 条题解
-
0
题解
思路
对任意模式 ,从左到右扫描:遇到
0前进一位;遇到1时选中它、答案加一,并跳过当前位置及其后两位。这样得到的选中数恰为 。直观上,一个被选中的
1可以用长度不超过三的局部区间同时满足相邻位置;而任意连续三位中最左侧仍未覆盖的1都必须付出至少一个1。由交换论证,可把最优解的第一次付费移到最左侧未处理的1而不劣,于是上述贪心最优。做法
令 表示所有以 为左端点的子串的 值之和(下标从 开始)。
- 若 ,删除这个前导零不改变贪心选择,所以 ;
- 若 ,所有右端点 都先选中 ,共有 次贡献;余下决策从 开始,所以 。
越界位置的 为零,最终答案为 。每组复杂度 ,空间 ,也可用常数滚动空间。
独立验证算法
预处理每个位置右侧第一个
1。对每个1位置 ,它在贪心链中的后继是 及以后第一个1。令 。每个左端点的贡献就是从其右侧第一个1开始的 。这与上述按左端点递推的程序结构不同,可用于大规模交叉验证。正确性证明
对固定左端点和右端点,贪心选中的每个位置都贡献一次。若首个未处理的
1位于 ,任何可行方案必须在覆盖 的局部多数证明中付出至少一个1;把这次付费移动到 后,至多影响 ,不会增加后缀所需付费。因此选中 并从 继续是最优的。递归应用即得贪心值为 。对所有右端点求和:当 时,位置 被所有 个以 开头的非空子串选中,剩余贡献与从 开始完全相同;当 时直接转到 。故递推正确,累加全部左端点即得到题目要求的所有子串之和。
复杂度
每组时间复杂度 ,空间复杂度 。
- 1
信息
- ID
- 1440
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者