Teek is Loading...
主题
由贪心,对于一个 a→a′,他所耗费的步数是可以贪心求出的:即若 ∑ai′>∑ai,ai 不断往左移;否则往右移。并且在最优步数 s 往后想刷步数达到 k 步则只能选择一个球左右横跳,即 s≡k(mod2)。
因此可以设 fi,j,s 表示考虑 a′ 前 i 个位置,放了 j 个球,总共耗费了 s 步,假设 a 中第 j 个球位于 ax,则有
时空复杂度均为 O(n3)。
考虑优化状态拆贡献,对于位置 i 来说,在这个位置的操作次数就是 gi=|∑ai−ai′|,并且相邻两个位置的贡献相差不会超过 1,由 ∑gi≤k,易得 g 的量级是 k 的。
设 fi,j,k 表示考虑前 i 个位置,gi=j,∑gi=k 的方案数,枚举 a′ 这个位置放不放球
时间复杂度 O(nkk),空间复杂度可用滚动数组优化到 O(kk)。