思路
赛时想到的部分:
这个题和之前做过的一题很像, 说不定可以冲正解?
唯一的区别就是差 , 而且每次可以 \(\pm k\)
分数组第一位一定要是 \(0\)
你发现在序列之中匹配完了之后, 剩下 \(k\) 个数就要做 \(k\) 次操作
如果匹配了 \(i\) 对, 剩下来 \(k\) 个数, 总花费为 \(k + i\)
你发现时间复杂度给的可以放过 \(\mathcal{O} (n 2^n)\) , 往这个方向想
你又发现一次操作至少可以消掉一个数, 那么肯定是尽可能匹配优先
用 \(\rm{dp}\) 的方法做, 差不多会了, 一会继续推, 实在太难受了先打暴力
好的, 实际上直到这里都非常正确
容易发现一次操作至少可以清零一个位置, 而匹配操作可以更优
对于匹配操作, 一定是取出数列的一个集合, 其中集合内和为 \(0\) , 这样子可以省下操作次数, 那么我们一定优先匹配
所以我们可以将这个问题转化成寻找尽量多尽量小的集合, 满足集合内和为 \(0\) 且不存在子集内和为 \(0\) , 假设数量为 \(k\) 就可以省掉 \(k\) 个操作, 这个不消说
那么怎么解决这个问题
根据时间复杂度你也要考虑状压, 令 \(dp_{\mathbb{S}}\) 表示选择了 \(\mathbb{S}\) 中的点, 最多选出的集合数
显然的我们可以挨个尝试加入, 只要子集和变成 \(0\) 了证明出现了新的最小集合, 那么转移一下即可
具体的
其中 \(\mathbb{S}^{\prime}\) 和 \(\mathbb{S}\) 差了一位 \(1\) , \(sum\) 表示选择点的和
总结
转化问题的能力还不够, 还得多练
差分数组的常见性质
这个题最优的 \(\rm{dp}\) 就算想不到, 也应该推出比较好的 \(\rm{dp}\)