標籤很暴雷的說了狀態壓縮,用二進位第$i$位存數字$i$是否出現過
於是可以定義出 dp 狀態:
$dp(i,s,j)$代表長度為$i$,每種數字有沒有出現過的狀態為$s$,以$j$結尾的方法數
題目說相鄰兩數差值不超過$2$,所以枚舉$dp(i-1,...,j-2 ~ j+2)$轉移
不過當前選擇數字j,之前有選$j$或沒選$j$都可以轉移到$j$已選,所以$s$的第$j$位 0/1 都要轉移
預處理建表完$O(1)$回答,答案為 dp[p][(1<<9)-1][q]
時間複雜度 $O(9\times P \times 2^9 + N)$
code : https://github.com/kzzz-jpg/CP/blob/main/cpp/cchs/a287.cpp