hdu2089 不要62 數字dp

2022-05-20 11:22:46 字數 1771 閱讀 1998

題目給出乙個區間 ,詢問這個區間中符合要求的數的數量,一般數字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 #include2

using

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 表示不存在不吉利數字,且最...