題目給出乙個區間 ,詢問這個區間中符合要求的數的數量,一般數字dp的文法都是這樣,資料量大的情況下可能會有le18,所以一定需要數字dp這樣的複雜度在o(logn)量級的演算法才能夠勝任。
本題給出的要求是數中不含4和62.定義狀態dp[i][j]:位數為i的數開頭數字為jde符合要求的數的數量,轉移方程式:dp[i][j]=sigma(k=0->k=9)(dp[i-1][k]) ,其中要求!(j==6&&k==2)&&j!=4。根據轉移方程,我們很容易就能求出[0,n]範圍內的符合要求的數的數量。
**如下:
1 #include2using
namespace
std;
3 typedef unsigned int
ui;4 typedef long
long
ll;5 typedef unsigned long
long
ull;
6#define pf printf
7#define mem(a,b) memset(a,b,sizeof(a))
8#define prime1 1e9+7
9#define prime2 1e9+9
10#define pi 3.14159265
11#define lson l,mid,rt<<1
12#define rson mid+1,r,rt<<1|1
13#define scand(x) scanf("%llf",&x)
14#define f(i,a,b) for(int i=a;i<=b;i++)
15#define scan(a) scanf("%d",&a)
16#define mp(a,b) make_pair((a),(b))
17#define p pair18
#define dbg(args) cout<<#args<<":"<19
#define inf 0x7ffffff
20 inline int
read()
24while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'
0',ch=getchar();
25return ans*w;26}
27int
n,m,t;
28const
int maxn=1e4+10;29
int digit[20
];30
int len=12;31
int dp[13][12
]; 32
void init()//
預處理dp陣列
3345}46
}47}48
int solve(int
l)49
58return
ans; 59}
60int
main()
6176 digit[l+1]=0;//
注意設定l+1的數值,否則上乙個樣例的數值會影響到這個樣例的計算
77int ans=solve(l);
78 l=0;79
while
(m)80
84 digit[l+1]=0
;85 ans-=solve(l);//
實際上求的是[0,m-1]之間的符合條件的數的數量
86 pf("
%d\n
",ans);
87}
88 }
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 表示不存在不吉利數字,且最...