動態規劃學習系列 數字DP(練手一)

2021-06-28 16:42:07 字數 964 閱讀 8442

hdu 2089 不要62

題目大意是統計【a,b】區間內沒有4並且沒有62的數,因為有之前那道題的鋪墊,很快想到了解決方法。

思路:預處理乙個dp陣列,dp【i,j】代表最高位為 j 的 i 位數滿足題述要求的的個數;然後分別統計【0,b】和【0,a-1】區間內滿足條件的數——與之前那題類似,不過更簡單了,具體來看**吧:

**

#include 

using

namespace

std;

int n,m,dp[10][10],num[10],cnt,ans;

int solve(int n)

num[cnt+1]=0;

for(int k=cnt;k>=1;k--)

if(num[k]==4||(num[k+1]==6&&num[k]==2))

break;

}return ans;

}int main()

return

0;}

從**看,我們求解【0,b】區間內符合條件的數的方法依舊類似,從最高位(k = cnt)開始,每次取一位,統計最高位為 i 的數的個數(0 <= i <= num[k]),於是變成下面的**:

for(int k=cnt;k>=1;k--)

if(num[k]==4||(num[k+1]==6&&num[k]==2))

break;

}

這裡有乙個需要注意的地方:如果之前的的數字已經出現不符合的情況了,那麼我們就不應該繼續統計下去!(因為這個wa了一次)

總結

理解過上一道數字dp之後,看這道題並不會那麼吃力了,其實兩道題本質上是差不多的,只是最後進行數字統計的部分有點不同(難怪當時ta說砍樹那題是經典題)。

動態規劃學習系列 數字DP(練手三)

hdu 3652 解題思路 數字dp,狀態dp i j k c 表示 i 位數中,以 j 開頭的,模13為k的數的統計情況,其中 c 可取0或者1,0表示不包含13,1表示包含,這樣我們就可以把所有的數分成兩部分,設計狀態轉移方程。1 狀態轉移方程 dp i j tmp j l 13 1 dp i ...

動態規劃學習系列 數字DP(初識)

第一次知道數字dp這東西,是在大二新手賽,那時有一道 cutting trees 的題目,現在來看就是水題一道,可以用多種方法水過,可惜當時愣是沒做出來,其他水題也沒做出來,於是被大一虐成翔。抱著學習的態度,我們再來看看這道題。多組詢問,每組詢問a和b,為 a,b 範圍內,有多少個數是由乙個上公升序...

動態規劃之數字dp

數字dp,字面意思理解就是在數字的每一位上面去dp,動態規劃一般有兩種 遞推,記憶化搜尋 dfs 這裡就是用的記憶化。一般這種用在計數上面,對那些數字上面有限制的計數。這裡上一道模板題 題中就是要你統計1 n裡有 49 的個數。dp pos sta 表示到第pos位,狀態為sta的總數。我們一般是從...