数位dp 模板
板子
?? DP(pos,狀態(tài)變量...,限制布爾){if(pos==0)return 1;//一般每次執(zhí)行到這里時的數是要算入總結果的 不一定是1 根據題目確定if(!limit&&dp[對應狀態(tài)]!=-1)return dp[對應狀態(tài)]; //記憶化搜索int up = limit?d[pos]:9;//表示如果前面一位有限制 就說明這是擦著區(qū)間上界走的 需要返回d[pos] 如果沒有限制 說明沒臨界 返回9ll a=0;for(int i=0;i<=up;i++){if()...else if()...//針對不同的題目設置不同的變量記錄函數a+=(pos,狀態(tài)變量...,限制布爾&&i==d[pos]);//如果這兩個條件都有再傳遞}if(!limit)dp[狀態(tài)]=a;//已經求出對應狀態(tài)值下的結果了 記錄下來return a;}所以 數位dp其實就是一種求解有關于l到r有多少個符合條件的數目類似的統計問題的解題思路
一遍遍數字枚舉太慢
不如我們根據條件枚舉數位
數位dp本質上是記憶化搜索
我們需要在數位上進行遞推
把條件篩選融入到數位上的篩選
所以數位dp其實就是一種算法策略可以讓我們
記憶化地去搜索我們想要得到的數據結果
我們把這個數位給他拆開一位一位的枚舉
根據題目對應的約束條件 設置記錄結構
一般把對應長度,其余位數符合什么什么條件的 并且沒有限制的數目記錄下來
以供我們之后搜到相同的狀態(tài)重復利用數據
降低搜索分支
總結
- 上一篇: 为什么手机游戏手柄没有流行起来?
- 下一篇: [剑指offer]面试题第[60]题[J