數字dp詳解及模板

2021-08-22 04:27:41 字數 1998 閱讀 3266

數字dp一般應用於:

求出在給定區間[a

,b] [a,

b]內,符合條件p(i)p

(i)的數i

i的個數.條件p(

i)' role="presentation" style="position: relative;">p(i

)p(i

)一般與數的大小無關,而與 數的組成有關.

比如說在hdu2089中, 讓求區間內數中不有462的數字個數之和

對於此類問題,我們一般設dpdp

陣列dp[i]

[j] dp[

i][j

],表示i位數,最高位是j的數,不含有624的數有多少個

對於上述不含有624的要求,遞推式如下

換成**就是:

if(j==4)

dp[i][j] = 0;

else

}

到此,我們就能求對於所有能被10整除的滿足條件的數的個數了

而對於任意數

x x

,只需要將其拆成x=

x1∗10

0+x2

∗101+

x3∗10

2+..

....

' role="presentation" style="position: relative;">x=x

1∗100

+x2∗

101+x

3∗102

+...

...x

=x1∗

100+x

2∗101

+x3∗

102+.

....

.的形式即可

然後求出

x x

和y' role="presentation" style="position: relative;">y

y的個數,相減便是答案

#include 

#include

#include

#include

#include

#include

#include

#include

#define in freopen("in.txt","r",stdin)

#define out freopen("out.txt","w",stdout)

#define io dowhile(0)

using

namespace

std;

typedef

long

long ll;

const

int maxn = 1e4+10;

const

int maxn = 1e6+10;

const

int inf = 0x3f3f3f3f;

const

int inf = 0x3f;

const

double eps = 1e-7;

const

double pi = acos(-1);

const

int mod = 1e9+7;

int dp[15][15];

int num[15];

void init()

}}int ask(int x)

if(num[i] == 4||(num[i]==2&&num[i+1]==6))

break;

}return ans;

}int main()

數字DP入門 數字DP模板

數字dp是一種計數用的dp,一般就是要統計乙個區間 le,ri 內滿足一些條件數的個數。所謂數字dp,字面意思就是在數字上進行dp咯。數字還算是比較好聽的名字,數字的含義 乙個數有個位 十位 百位 千位.數的每一位就是數字啦!之所以要引入數字的概念完全就是為了dp。數字dp的實質就是換一種暴力列舉的...

數字dp 模板

dp pos,狀態變數.限制布林 if limit dp 狀態 a 已經求出對應狀態值下的結果了 記錄下來 return a 所以 數字dp其實就是一種求解有關於l到r有多少個符合條件的數目類似的統計問題的解題思路 一遍遍數字列舉太慢 不如我們根據條件列舉數字 數字dp本質上是記憶化搜尋 我們需要在...

數字DP模板

數字dp問題,大多是統計數量,通常用按位處理的方法解決。具體為 詢問 l,r l,r l,r 中滿足某一條件的數。利用字首和的思想,我們可以把問題簡化,即轉化為詢問 1,r 1,r 1,r 和 1,l 1 1,l 1 1,l 1 實現時,常常使用記憶化搜尋,由於有很多限制條件,所以常常增加幾維狀態,...