我们用 $f_{i,j}$ 表示 满足“前 $i$ 个含 $1$ 的数量不大于 $j$”的数的个数,相当于求组合数 ${i \choose j}$,即 $ f_{i, j} = f_{i-1, j} + f_{i-1, j-1} $ 处理完动态规划的计算之后,我们从第 $n$ 位(即从右开始数第 $n$ 位)开始,如果 “前 $i-1$ 个含 $1$ 的数量不大于 $L$”的数的个数” 大于序数 $I$ (即 $f_{i-1, L} \ge I$),那么我们输出 $0$,否则输出 $1$ (想一想,为什么) 不难理解,如果一个数的位数大于另一个数的位数,那么这个数一定大于另一个数(废话)。 那么前 $i-1$ 既然已经大于序数 $I$ 了,那么答案对应的数一定小于当前位取 $1$ 时候的数,所以当前位取 $0$。反过来同理。 输出完一位之后序数 $I$ 应减去对应的 $f_{i-1, L}$,并且确定完一位是 $1$ 之后,$1$ 的数量 $L$ 也应减一。即 $I \gets I - f_{i-1, L}$, $L \gets L - 1$
题目862 二进制数01串
AAAAAAAAAAAAA
6
评论
2022-04-08 13:45:12
|