數字DP的記憶化搜尋形式

2021-06-29 04:06:06 字數 541 閱讀 6672

數字dp的記憶化搜尋形式比一般遞推形式好寫多了,而且一般不容易出錯。

dfs求[0,n]有多少個符合的,先把n換成字串形式。

cur:現在處理到哪一位。

s:搜尋到目前為止,之前的狀態,具體什麼狀態看情況而定。

e:是否到達邊界,如果沒到這一位只取到9,否則只能取到bit[cur]。

z:前導0標記,也就是是否前面的都是0,有些情況需要特殊判斷。

一般情況下dp陣列開二維,dp[cur][s]為e和z都為0的情況,因為e和z都為0的情況比較多。特殊情況開三維什麼的都是可能的。

當cur<0時判斷當前狀態是否符合,符合返回1,不符合返回0。

每次根據s和當前的取值i計算出新的s。

int dfs(int cur,int s,int e,int z)

if(!e&&!z) dp[cur][s]=ans;

return ans;

}int solve(int n)

return dfs(len-1,0,1,1);

}

codeforces (數字dp 記憶化搜尋)

題意 列舉 a,b 之間的beautiful數 即這個數所有位上的數都能整除這個數 思路 用pos記錄位置 num記錄當前位置前面所有位組成的數 當時開不了這麼大的陣列 有知道1 9 的最小公倍數是2520 所以num記錄 上文的num 2520 就可以了 現在就剩下記錄當前位置前面各位都出現過0 ...

數字DP小結 記憶化搜尋版

之前寫數字dp是用dp方程遞推形式寫,接觸記憶化搜尋版後,發現使用dfs更加清晰明了,思路很順,簡潔的多w。首先上模板,以hdu 2089 不要62為例 define crt secure no deprecate include include include include include in...

記憶化搜尋 dp

例子 33 1132 3411 1先去找 1,1 的最長距離,很明顯為1 接著找 1,2 的最長距離,很明顯為1 接著找 1,3 的最長距離,為2 1,3 1 2 然後找 2,1 的最長距離,為2 2,1 1 1 然後是 2,2 的最長距離,如果沒有記憶化,那麼搜尋過程為 2,2 2 1 1 1 但...