排列 到 的整數,使得相鄰兩數互質,部分位置一定要填入某些數字,請問剩餘數字的填法方案數為何?
感謝 morris 提供題目大意!
其實我們可以把所有整數當做點、兩個整數是否互質作為建立邊的條件。所得到的圖之中,一個合法的排列便對應了圖上的一條 Hamiltonian Path。
一個簡單的想法即是:考慮「 當前序列長度」、「 哪些數字做過了」、「 當前最末一個數是多少」,於是我們便有以下的遞迴轉移關係:
一個簡單的估計是:第一個維度 ,第二個維度 ,第三個維度 ;轉移是 ,因此時間複雜度是 。但是真的是這樣嗎?
如同 Hamiltonian Path,我們發現:第二個維度根本已經內含第一個維度的資訊了呀!因為 。所以其實我們要儲存的空間只需要第二、三維度也就是 ;並且以二進位方式枚舉 就可以當做正確的順序進行動態規劃了!這樣估計時間複雜度是 。
如果我們考慮子集 ,預先將已經出現在序列上的數字排除,我們可以得到一個 的作法,其中 是空格數。轉移的時候要特別注意 的處理。