學習筆記 數字DP的dfs寫法

2022-05-31 08:54:10 字數 1379 閱讀 3395

跟著洛谷**走,演算法習題全都有!

嗯,沒錯,這次我也是看了洛谷**的第84期才學會這種演算法的,也感謝mathison大佬,素不相識,卻寫了一長篇文章來幫助我學習這個演算法。

感覺dfs版的數字dp還是挺簡單的,直接dp然後遞推統計答案的那種比它搞腦子多了。

在dfs版本中,我們需要特別注意的地方有兩個:

1、是否貼上界:

這是個啥呢?

很簡單,給大家舉個栗子,假如我們要求解1-12345這段區間,如果我們已經做了3位,而前三位正好是123,那麼我們第4位就只能取0-5,否則我們就可以取0-9。

2、有沒有前導零:

這有為啥要特殊記呢?

因為前導零會影響我們對合法方案的統計。

當現在的狀態有前導零,或者貼上界的時候我們就不能記憶化,因為它們是與別的狀態不同的,不同之處就是上面講的那些啦。

function

dfs(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...