動態規劃 簡單數字dp 不要62(HDU2089)

2022-05-05 11:30:10 字數 2382 閱讀 9748

杭州人稱那些傻乎乎粘嗒嗒的人為62(音:laoer)。

杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。

不吉利的數字為所有含有4或62的號碼。例如:

62315 73418 88914

都屬於不吉利號碼。但是,61152雖然含有6和2,但不是62連號,所以不屬於不吉利數字之列。

你的任務是,對於每次給出的乙個牌照區間號,推斷出交管局今次又要實際上給多少輛新的士車上牌照了。

input

輸入的都是整數對n、m(0對於每個整數對,輸出乙個不含有不吉利數字的統計個數,該數值佔一行位置。

sample input

1 100

0 0

sample output

80
數字dp之前聽說了一下,今天終於學到了,原來就是根據數字的位數(千位、十位、百位等)做dp,然後就是求某個區間上符合某條件的數的個數,一般就用數字dp來解決,畢竟暴力幾乎t。

對於上面這道題,求的是區間上不含有4和62的數字的個數,直接求出0到這兩個數直接符合條件的數字,然後做差就行了。

第一種dp方法:

用dp[i][j]表示第i位上為j-1到j的所有數字中符合條件的數字的個數。比如dp[2][1]就是0~10中符合條件數字的個數,dp[3][2]就是100~200之間符合條件的數字的個數。

用狀態轉移方程來表示就是:

0, j=4;

dp[i][j]= ∑ dp[i-1][k],(0<=k<=9), j!=6;

∑ dp[i-1][k],(0<=k<=9&&k!=2), j=6;

然後在把給出的數字xnxn-1……x1(這是乙個數字,xi表示第i位上的數)分成xn*10^(n-1)+x(n-1)*10^(n-2)+……+x1,把每一位上符合條件的數字求出來就好了。

**:

1 #include2

using

namespace

std;

3int n,m,dp[8][10];4

void

init()518

}19}20

}21}22

int find(int

x)23

30 p[cnt+1]=0;31

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

3238

if(p[i]==4||(p[i]==2&&p[i+1]==6))break;39

}40return

ans;41}

42int

main()

43

不明白find函式的建議用筆模擬一遍。還有就是結果是f(m+1)-f(n)是為什麼?這是因為f(m)求的是[0,m)區間上的個數,並沒有把m這個數算進去,f(m+1)-f(n)得到的就是[n,m]上的答案啦。

第二種dp方法:

這個方法用到了dfs和記憶化搜尋,還好在這之前學了記憶化搜尋和dfs,不然不可能搞懂這個鬼東西的。

先貼上**:

1 #include2

using

namespace

std;

3int a[8],f[10][2];4

int dfs(int d,bool is6,bool

limit)514

if(!limit)f[d][is6]=cur;

15return

cur;16}

17int solve(int

x)18

23return dfs(cnt,0,1

);24}25

intmain()

2633

return0;

34 }

1,先看dfs(int d,bool is6,bool limit)這裡的d是指數字的第幾位,is6是判斷這個位置上的數字是不是6,limit用來判斷這個位置上的數字有沒有達到最大

2,f[d][is6]是用來記憶化搜尋的,記憶第d位是6和不是6的數的個數,不用每次都重複去算,可以加快dfs的速度

3,第8行是判斷上界用的,如果這一位數已經到了上界,那麼就從0最大放到a[d],否則一直放到9

4,因為solve(m)求的是[0,m]區間,所以答案應該是solve(m)-solve(n-1)

不要62 HDU 2089 (簡單數字DP)

杭州人稱那些傻乎乎粘嗒嗒的人為62 音 laoer 杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。不吉利的數字為所有含有4或62的號碼。例如 62315 73418 88914 都屬...

HDU2089 不要62 數字DP

problem description 杭州人稱那些傻乎乎粘嗒嗒的人為62 音 laoer 杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。不吉利的數字為所有含有4或62的號碼。例如 ...

Hdu2089 不要62 數字dp

include includeint dp 10 3 dp i 0 為位數小於等於i且不含62也不含4的數字的個數 dp i 1 為位數為i且首位為2且不含62也不含4的數字的個數 dp i 2 為位數小於等於i且含62或4的數字的個數 int digit 10 void er int wei in...