2.dp[pos][sta],pos表示的是遍歷的數的層數(例如十位百位千位),層數是從大到小的,遍歷到-1層則表示當前的數已經形成,則可以返回當前的數的在問題中所計算出的值temp,sta表示的是對於題目,有些不同的資料可以有的相同的狀態,例如:hdu中的不要62(統計乙個區間中沒有4和62出現的數的數目為多少),顯然不同的位數相同的狀態就是是否含有6,dp[pos][sta]//sta表示是否含有6,有為1無為0,當百位為0,十位為6時,要呼叫的是dp[0][1](dp[0][1]==9),而不是dp[0][0]==10
模板:
int a[pos]//用來儲存實際引數的各個數字的值
int dp[pos][sta] //pos用來表示當前的層數,sta用來表示可以公用的狀態
int dfs(int pos,int sta,bool limit)//pos表示下一層是哪一層,sta下乙個層數遍歷的位置可一公用的狀態,limit用來限制當前的層數是否需要限制最高的遍歷的數
if(!limt&&dp[pos][sta]!=0)
int up=limit?a[pos]:9;//確定範圍
int temp=0;
for(i=0;i<=up;i++)
if(!limit)
dp[pos][sta]=temp;//記憶化
return temp; }
int solve(int x)
return dfs(cnt,sta,1);
}
數字DP 總結
數字dp適合在一段數的區間內找出滿足某些條件的數的個數,這個時候往往不能之間遍歷,肯定會超時,則一般使用數字dp來解決。數字dp的常見形式是dp i j 表示開頭是j的i位數滿足條件的有多少個,當然也有其他dp i j k 等等,但i,j,k都很小,不會像直接遍歷那麼耗時。以前做過乙個不要62的題 ...
數字DP總結
數字dp基於動態的思想,記錄狀態以至於不用重複的計算,能夠處理大規模的數 其時間複雜度為o 狀態數 轉移數 狀態數是dp陣列的大小,轉移數是for迴圈大小 這個時間我也不是很想得通,某大佬講的。比較簡單的幾種題型 1 求l r數字中包含某些數字特徵的數量和 如數字子串中是否有13等 hdu 2089...
數字dp總結
到這裡,數字dp就告一段落了,kuangbin的專題還差一道,那一道涉及到了ac自動機,目前還不可做。簡單寫下數字dp的總結 數字dp有它固定的模板,例如solve,dfs函式的大體寫法,和limit的處理。唯一不同的地方就是字首狀態state的維護,最為詳細的state記法就是把前面所選擇的每乙個...