題目鏈結
題意:給你乙個
n n
和乙個m' role="presentation" style="position: relative;">m
m,求在[n
,m] [n,
m]
之間的數有多少個不包含連續的
62 62
也不包含
4 4
。 題解:
這種題一看就是數字dp。dp
[i][
j]' role="presentation" style="position: relative;">dp[
i][j
]dp[
i][j
]表示前
i i
位,當前這一位數字是
j' role="presentation" style="position: relative;">j
j的方案數。狀態轉移方程是dp
[i][
j]=∑
k=09
dp[i
−1][
k]((
j=6和
k=2不
同時滿足
)且j≠
4)d p[
i][j
]=∑k
=09d
p[i−
1][k
]((j
=6和k
=2不同
時滿足)
且j≠4
)初始狀態為dp
[0][
0]=1
d p[
0][0
]=
1。 我們把[0
,1e6
] [0,1
e6
]的答案預處理出來,詢問的時候就不用每次都計算了。
有兩個細節:
第乙個是傳參的時候把兩個數都加了一,因為統計答案時對於每一位我們是統計當前位小於傳進來的引數的當前位的答案之和,所以統計到各位的時候答案會少了當前數,所以傳參是答案要加一。
第二個是在統計答案是如果統計完當前位之後出現了有4 4
或者連續
62' role="presentation" style="position: relative;">62
62的情況,就直接退出了。原因是我們的dp[i][j]實際上是表示j∗
10i−1
到(j+
1)∗10
i−1−
1 j∗10i
−1到(
j+1)
∗10i−
1−
1之間的答案,舉個例子,當要求的數的
241 241
的時候,當i=
3,j=
0 i=3,
j=
0時,實際是累加上了[0
,99] [0,
99]
的答案,而由這個例子不難看出,當統計完i=
2,j=
3 i=2,
j=
3,也就是[0
,239] [0,
239]
之後,就已經是最後答案了,再繼續加就是把不合法的往裡累加了,也就是說,如果繼續的話是會累加[0
,9] [0,
9]
的答案,但是前兩位是
24 24
的情況下再往後加就是算
[24...
,24...] [
24...
,24...
]的答案了,顯然它們都是不合法的,所以要停止累加。
**:
#include
using
namespace
std;
int n,m,dp[20][10],dig[50];
int work(int x)
dig[len+1]=0;
for(int i=len;i>=1;--i)
if (dig[i]==4||(dig[i+1]==6&&dig[i]==2))
break;
}
return ans;
}int main()}}
while(~scanf("%d%d",&n,&m))
return
0;}
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 表示不存在不吉利數字,且最...