跟著洛谷**走,演算法習題全都有!
嗯,沒錯,這次我也是看了洛谷**的第84期才學會這種演算法的,也感謝mathison大佬,素不相識,卻寫了一長篇文章來幫助我學習這個演算法。
感覺dfs版的數字dp還是挺簡單的,直接dp然後遞推統計答案的那種比它搞腦子多了。
在dfs版本中,我們需要特別注意的地方有兩個:
1、是否貼上界:
這是個啥呢?
很簡單,給大家舉個栗子,假如我們要求解1-12345這段區間,如果我們已經做了3位,而前三位正好是123,那麼我們第4位就只能取0-5,否則我們就可以取0-9。
2、有沒有前導零:
這有為啥要特殊記呢?
因為前導零會影響我們對合法方案的統計。
當現在的狀態有前導零,或者貼上界的時候我們就不能記憶化,因為它們是與別的狀態不同的,不同之處就是上面講的那些啦。
functiondfs(pos,...,lead,flag:longint):int64;
varres:int64;
i,limit:longint;
begin
//pos:當前在做第幾位。
//lead:0/1 有/沒有 前導零
//flag:0/1 是/否 貼上界
if pos>len then
exit(...);
......
...... //各種優化
if (dp[pos][...]<>-1)and(lead+flag=0) then
exit(dp[pos][...]); //記憶化
if flag=1
then limit:=a[len-pos+1] else limit:=9
; //最高列舉到幾
res:=0
;
for i:=0
to limit do
res:=res+dfs(pos+1,...,...,ord((lead=1)and(i=0)),ord((flag=1)and(i=limit)));
if lead+flag=0
then dp[pos][...]:=res;
dfs:=res;
end;
function
part(x:int64):int64; //數字分離
begin
len:=0; part:=0;while x>0
dobegin inc(len); a[len]:=x mod
10; x:=x div
10; end
;part:=dfs(1,...,1,1);
end;
DP專題 學習筆記 數字 DP
目錄3.練習題 update 2021 2 23 最近作者發現數字 dp 的 f 陣列初始化有問題,導致 出現了根本性錯誤 原理不變 現在已經糾正,對各位讀者造成的困擾深表歉意。數字 dp,是一種 dp 廢話 專門用於數字統計類問題。這種問題首次接觸可能會有些難理解,但是練過幾道題之後就會掌握套路了...
演算法筆記 數字dp
前言 當我們遇到某些題目的時候 比如像讓你統計l r這乙個區間內的數字和以及滿足條件的數有幾個這一類的題目 常常會因為區間太大而無法計算。這時候,我們就需要用上我們偉大的數字dp啦 數字dp的實質就是換一種暴力列舉的方式,使得新的列舉方式滿足dp的性質,然後記憶化就可以了。nm這本質上不還是記憶化搜...
hdu 3555 數字dp的dfs寫法
題意 給定乙個long long型別能夠存下的數字n,統計1 n之間含有49的數字的個數 思路 初始版本 需要記錄當前位置,前一位置放了那個數字,當前是否已經包含49,是否有上界這四個資訊,也就是dfs的四個引數。dfs pos,pre,istrue,limit 其實這種做法有點相當於把普通的數字d...