執著追求並從中得到最大快樂的人,才是成功者。——梭羅
第一次做這個題是暴力過的,感覺也沒啥,今天集訓講數字dp,想用數字dp做一下。自己還真是菜的扣腳啊~ 寫一下題解如果有錯誤希望指正!不勝感激。
原題鏈結
f[i][j] i代表有幾位數,j代表起始數字
例如f[3][1] 代表的是 100~199
即使是2^63-1 用 f[18][9]表示也足夠了 還真是神奇!
既然找到最優解那就好辦了,至於為什麼得到上面的式子呢?
1.當j=4也就是i位數4開頭,當然是0咯
2.當不是6 2時可以通過乙個例子來找到答案
假設f[3][3],即3xx
3xx可以寫成30x、31x、32x......39x
是不是發現規律了呢?
因為最高位3是一定的,所以我們只需要把f[i-1][k](0<=k<=9)加起來就行了
此時f[i][j]中存放了許多資料,讓我們看一下:
![資料](
既然處理好了f[i][j],接下來就是處理輸出問題了(這裡是我整理了一下其他人的部落格,再加上上面的一些解釋,應該沒問題了)
如何根據陣列f求對於乙個數n,0~n滿足要求的數呢?
例如335,對應f[3][3],但是滿足要求的數有336,347,358.....這些數超過了335
所以通過f[3][0],f[3][1],f[3][2]求得首位數字小於3的滿足條件的三位數,f[3][0]求得的數是001,052,093...也就是所有滿足條件的一位或兩位數……我們求得所有的2xx,1xx,0xx.
接下來要求的是如334,327這類首位是3滿足條件的數字,既然首位只能是3,也就是第一位已經選完了,那麼我們只要選擇滿足小於35的數字就可以了。和上面同理,我們只要求出f[2][0],f[2][1],f[2][2],就可以求出首位小於3的兩位數。這時求得的是32x,31x,30x。
然後我們求所有小於5的數字就ok了。小於5也就是f[1][0],f[1][1],f[1][2],f[1][3],f[1][4]。這時求得的是33x.
到此,所有小於335且滿足的數全部求出。
但是還需要考慮的問題是62,4。
如果某一位數字為4,如77432的第三位(從左向右看)是4,那麼我們依次求出
1、6***x,5***x,...,0***x
2、76***,75***,...,70***
3、773xx,773xx,...,770xx
我們接來下需要求的是7742x....7740x,但這時所求的數是774xx的數,必然含有4,這時停止。
對於62,如果某一位數字是6,如5675,我們求完5***,4***,...0***之後再求56xx時,注意566x,565x,..,563x,561x,沒有562x。如果數字中含有62,如5627,那麼同4,求到562x的時候就應該停止繼續求下去了。
因為求得的是小於n的數,所以求[0,n]之間的數需要求n+1.
以下是**:
#include
#include
#include
#include
using
namespace
std;
int f[12][10];
int num[12];
void init()
int solve(int n)
int ans=0;
for(int i=len-1; i ; i--)
if(num[i]==4 || ( num[i]==2 && num[i+1]==6 ))
break;
}return ans;
}int main()
}
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...
hdu 2089 不要62 (數字dp)
思路 用變數記錄吉利數,和最高位為2的吉利數還有不是吉利數的個數。code include include includeusing namespace std int dp 10 3 dp i j i表示位數,j表示狀態 dp i 0 表示不存在不吉利數字 dp i 1 表示不存在不吉利數字,且最...