诊断分析
我们发现 $n$ 比较大,直接 $2^n$ 暴力肯定不行,想着 $d$ 很小,能不能有什么性质和判定。
我们发现,位置 $i$ 只能选 $[i-d,i+d]$ ,意味着状态只有 $2d+1$ 种。
能力测评
假设 $1 \sim i-1$ 构成状压集合 $\texttt{S}$,表示 $[(i-1)-d,(i-1)+d]$ 内的选数情况。
我们要保证一件事,就是 $\texttt{S & 1 = 1}$ 。因为 $i$ 够不着 $i-d-1$。
然后取 $\texttt{S’ = S >> 1}$ 表示 $[i-d,i+d]$ 内的选数情况。
在进行内层循环 $j\in [0,d+d]$。必须满足 $j \notin S$。
分两种情况讨论:
- $a_i\neq -1$:如果 $a_i=i+(d-j)$ 那么就直接把 $f(i,S’\cup{a_i})\leftarrow f(i,S’\cup{a_i})+f(i-1,S)$。
- $a_i=-1$:同样 $f(i,S’\cup{i+(d-j)})\leftarrow f(i,S’\cup{i+(d-j)})+f(i-1,S)$。
课堂小结
1 | const int N = 514, D = (1 << (1 + 4 + 5 + 1)) + 4; |