數字dp學習筆記

2022-09-19 17:48:15 字數 1148 閱讀 4733

我們通常使用字首和的思想和記憶化搜尋來實現數字 dp。

就是上面所說的常見問法。

例題:windy 數

int dfs(int k,int x,int p,int q)

if(!p&&!q)

f[k][x]=res;

return res;

}

這道題的難點就在於對相鄰兩個數字之差至少為 \(2\) 的處理,我們一開始將 \(x\) 設為 \(-2\),後面只需要判斷前導 \(0\) 即可。

這類題目的資料範圍通常會很大,\(l\) 和 \(r\) 需要用陣列存,這時候就需要用 \(\mathrm(1,r)-\mathrm(1,l)\),再單獨判斷 \(l\) 是否符合條件。

例題:magic numbers

ll dfs(int k,int x,int p)

}else

if(!p)

f[k][x]=res;

return res;

}

這道題就是多加了被 \(m\) 整除這個條件,我們在 dfs 中用 \(x\) 表示模 \(m\) 的餘數,每次變為 \((x\times 10+i)\mod m\),最後判斷是否為 \(0\) 即可。

bool check(char *s)

else

}return !x;

}

這裡順便把 check 函式也放上來了。

這類題目通常問的不是符合條件的數的數量,而是問符合條件的數的和等,這時候用結構體進行記憶化即可。(這類題目對數學好的選手比較友好,因為通常需要推式子)

例題:恨 7 不成妻

我太菜了,還沒調出來。

這類題目通常與數字出現的次數有關,這時候我們用 \(sta\) 的二進位制來進行相應的表示即可。

例題:balanced numbers

ll check(int x,int y)

{ for(int i=0;i<=9;i++)

{if(y&(1《注意表示出現次數的 \(x\) 用異或轉移,表示是否出現過的 \(y\) 用或轉移。

根據個人經驗,要想完全掌握數字 dp,最重要的是多練習,這裡推薦乙份題單。

DP專題 學習筆記 數字 DP

目錄3.練習題 update 2021 2 23 最近作者發現數字 dp 的 f 陣列初始化有問題,導致 出現了根本性錯誤 原理不變 現在已經糾正,對各位讀者造成的困擾深表歉意。數字 dp,是一種 dp 廢話 專門用於數字統計類問題。這種問題首次接觸可能會有些難理解,但是練過幾道題之後就會掌握套路了...

數字dp筆記

我太菜了。放幾個例題慢慢品。1.不要62 題意 輸出一段區間上不出現62和4的數字總個數 include using nemespace std intini int x 存個數字,位數為k 一開始看的是最高位,所以初始是達到上限的 一開始那個數字沒有上一位,所以if6是0啦 return dfs ...

數字dp筆記

數字dp 一 問題簡介 與數字有關的區間統計問題 例 求給定區間中,滿足給定條件的某個d進製數的數量,而限定條件往往與數字有關,比如數字之和,制定數碼個數,數的大小分組等 基本思想 逐位確定,預處理 二 通用狀態 1.預處理,從高位到低位列舉當前數字第一次小於n的那一位,這樣的話,之前的位數都已經確...