初級數字DP hdu2089

2021-08-05 21:53:50 字數 1427 閱讀 8555

hdu2089 不要62
problem description

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

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

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

62315 73418 88914

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

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

input

輸入的都是整數對n、m(0output

對於每個整數對,輸出乙個不含有不吉利數字的統計個數,該數值佔一行位置。

sample input

1 100 0 0

sample output

author

qianneng

這是最基礎的數字dp.

題意為:

對於乙個整數n,如果(任何一位上是4)||(第i位為6,,第i+1位為2),則這個數是不吉利的

題目要求求n到m有多少數是吉利的。

首先想到暴力,列舉n到m的每個數,判斷是否合法,這樣應該會超時。

然後我們可以發現有許多數是屬於同一種型別的,並不用列舉每乙個;

這樣就想到用數字dp來做。

個人比較喜歡用dfs+記憶化來做數字dp的題目

只要用dp[i][j]來記錄還剩下需要決策的長度i前一位是否填的是6的吉利數的個數

列舉當前位上取什麼數,然後進行轉移,用flag1記錄前一位是否為6.

sum+=dfs(len-1,i==6);

此題看似是解決了,但還有乙個問題,最後生成的數會不會超出這個範圍?

可能的...

所以我們要用flag2來記錄前面幾位中是否都是達到上限的,如果是,那這位的上限就是digit[i],否則0~9都可以取。

這樣就將這道經典數字dp解決了。

如果有問題詳見**...

#include #include #include #include #include using namespace std;

int dp[10][2],digit[10];

int dfs(int len,bool flag1,bool flag2)

if(!flag2) dp[len][flag1]=sum;

return sum;

}int solve(int n)

return dfs(len,false,true);

}int main()

return 0;

}

數字DP HDU2089 不要62

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

數字DP HDU 2089 不要62

簡單的數字dp 數字dp的簡單思想 從低位到高位開始列舉 每次狀態有兩種 即 到當前位與上限n一模一樣 和 到當前位已經小於n 那麼就可以列舉當前位進行轉移 因為 到當前位與上限n一模一樣 只有一種狀況 所以不特意儲存 中dp陣列都表示 到當前位已經小於n dp 2 表示 已經出現62 dp 1 表...

數字DP Hdu 2089 不要62

ps 博主又水blog,是佳龍大神叫我幹的。乙個數被稱為吉利 手動滑稽 當且僅當其不含4和62。多次詢問乙個區間的吉利的個數。這題應該算是數字dp的裸題吧。考慮求出乙個固定長度出現的吉利數,然後分別考慮每一位就可以了。設f i 0 1 2 表示長度為 i 的吉利個數,首位為2的吉利個數,不吉利的個數...