數字dp入門之HDU 2089詳解

2022-05-07 03:36:09 字數 1507 閱讀 1136

problem description

杭州人稱那些傻乎乎粘嗒嗒的人為62(音:laoer)。 杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。 不吉利的數字為所有含有4或62的號碼。例如: 62315 73418 88914 都屬於不吉利號碼。但是,61152雖然含有6和2,但不是62連號,所以不屬於不吉利數字之列。 你的任務是,對於每次給出的乙個牌照區間號,推斷出交管局今次又要實際上給多少輛新的士車上牌照了。

input

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

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

sample input

1 100

0 0sample output

80題目大意:就是要你從乙個區間【n,m】中統計出有多少個不包含4和62(必須為順序相連不能拆)的數

解題思路:因為這道題很基礎,所以不一定只用數字dp才能做出來。但是傳達的思想要會。。。

所謂數字dp就是按照數的位動態規劃。

數字dp一般應用於:

求出在給定區間[a,b]內,符合條件p(i)的數i的個數.

條件p(i)一般與數的大小無關,而與 數的組成 有關

emmmmm...我們解決這個問題可以直接用迴圈求n-m中符合條件的個數,滿足則ans+1,但是要注意到假如他的範圍很大,或者說要篩選的數字位數很多,暴力求解的話就不太現實了;所以這裡我們可以利用字首和的思想先進行問題簡化,即【n,m】=【0,m】-【0,n)(n不取,因為我們要求的區間包含n,所以要使得求得的差是包含n得出來的結果)然後開始dp,然後進行記憶化搜尋(記憶化搜尋就是比如說你要求1-100,我們從求1-10開始,不包含4和62的有1,2,3,5,6,7,8,9,10,9個數,當輪到11-20的時候(直接記憶了1-10的結果)也是九個數,後面以此類推),記錄上一位是否為6和列舉這一位,如果沒有限制的話很好辦,直接列舉就可以了,但是這樣可能會超空間,因此我們每次都必須要判斷是否有最大的限制。

**如下:

//hdu2089

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

int a,b,shu[20],dp[20][2];

int dfs(int len,bool ifis6,bool shangxian)

//長度(也是第幾位)、當前位置是否是6、是否有上限

return shangxian?cnt:dp[len][ifis6]=cnt;

//如果有限制,那麼就不能記憶化,否則記憶的是個錯誤的數.記憶化就是不用重複之前的只是當前位數數字不一樣的迴圈

}int solve(int x)

return dfs(k,false,true);

}int main()

return 0;

}

如果還是不會可以跟著**走一遍或者dd我或者畫乙個n*n的數字矩陣。

如有問題,歡迎指摘。

HDU 2089 數字 dp 入門

可暴力,可dp。參考資料 click me 第二個版本的 參考資料 7k 的板子 第二個版本 在下面 做這道題的時候有兩個疑問 第一 既然在dp中 51 既可以看做 51 也可以看做 0051 或者 000051 那麼51這個數字會不會計算多次。第二 既然狀態轉移保證了數字的合法,在統計的時候是否還...

HDU 2089 數字dp入門

開始學習數字dp.一道昨天看過 思想的題今天打了近兩個小時.最後還是看了別人的 找bug.丟丟 傳說院賽要取消 這麼菜不出去丟人也好吧 include include include include include includeusing namespace std int n,m 數字dp 含6...

數字DP入門題 HDU 2089

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