傳送門
數字dp的入門題,看了半天才看懂。。。
題解:這裡再解釋一下,dp[i][j]表示第i位數為j的方案,很好想到dp[i][j] = sum(dp[i-1][k])其中j,k≠4,j≠6且k不同時等於2。在求區間[l,r]的時候,可以用區間[1,r]-[1,l-1]。因此,我們可以把dp先預處理出來,這樣大大地節約了時間。
自認為這道題還有乙個比較抽象的地方,就是在求比某個數小的所有滿足題意的時候。具體看我的**。
#include#includeusing namespace std;
int dp[10][10];
int digit[10],len;
void init()//預處理
} }}void get(int n)
}int cal(int n)
if(digit[i] == 4||(digit[i] == 2&&digit[i+1] == 6)) break;
/*為什麼這裡可以break,我們來看一看這個狀態下答案的值是如何求出來的
例如某個數num = 54361,得到的答案是f[5][3] + f[5][2] + f[5][1] + f[5][0] + f[4][3] + f[4][2] + f[4][1] + f[4][0]
(沒有加f[5][4]的原因是數字中不能有4,f[5][4]的值為0,所以沒有加)
f[5][j]的數已經包含了所有的以3,2,1開頭的5位數和所有的4位數,
而以5開頭的5位數是由f[4][j]相加得到的,而f[5][5]包含的數已經大於了原來的數,因此f[4][j]的實際含義就是第5位為5,第4位為j的情況
(開始我就是以為f[5][j]已經包括了所有f[4][k])
*/ }
return res;
}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 表示不存在不吉利數字,且最...