HDU訓練記錄2 基礎數字dp

2021-07-11 09:59:38 字數 2533 閱讀 4086

題目描述

傳送門題意:求0~n中含「49」的數的個數。

題解狀態:f[i][j]表示i位數所有以j開頭的數中合法(不含「49」)的數的個數。

轉移:if (j!=4||k!=9) f[i][j]+=f[i-1][k];列舉jk分別為i和i-1位數的開頭並且滿足條件。

求解時用總數減去dp值。

注意:這道題傳m+1的話有可能爆long long所以手動+1

**

#include

#include

#include

using

namespace

std;

#define ll long long

int t;

ll n,f[50][50],digit[50];

inline

void dp()

inline ll calc_ans(ll n)

return ans;

}int main()

}

題目描述

傳送門 題解

狀態:f[i][j]表示i位數所有以j開頭的數中合法(不含「4」「62」)的數的個數。

轉移:if (j!=4&&(j!=6||k!=2)) f[i][j]+=f[i-1][k];列舉jk分別為i和i-1位數的開頭並且滿足條件。

求解時字首和做差。

**

#include

#include

#include

using

namespace

std;

int n,m,f[10][20],digit[10];

inline

void dp()

inline

int calc_ans(int n)

return ans;

}int main()

}

題目描述

傳送門題意:求區間[a,b]內各個數字相加能被10整除的數的個數。題解

狀態:f(i,j)表示i位數,所有各個數字相加%10==j的數的個數。

轉移: f[i][j]+=f[i-1][(j+k)%10];

求解的時候注意:前面的數字會對後面的數字產生影響,所以在做後面的數字的時候要考慮到前面數字的和。

**

#include

#include

#include

using namespace std;

#define ll long long

ll t,n,m,mi[50],f[50][50],digit[50];

inline void dp()

inline ll calc_ans(ll n)

return ans;

}int main()

}

題目描述

傳送門題意:求區間[0,n]中所有能被13整除並且含「13」的數的個數。

題解狀態:f(i,j,k)表示i位數,mod 13==j, k=0 含「13」 k=1 不含「13」並且開頭不為「3」 k=2 不含「13」並且開頭為「3」 的數的個數

其實這種狀態的表示是比較經典的,並且前幾道題都可以用這種方式來dp,但是由於前幾道題比較簡單,用其他方法更好解決,但是這道題用這種方法就非常優越了。

轉移:基於

amod13+

bmod13≡

(a+b

)mod13(

mod13

) 進行轉移。

注意:由於前面的和會對後面產生影響,所以要維護乙個記錄和的量。細節比較繁瑣,具體看**。

**

#include

#include

#include

using namespace std;

int n,f[20][20][3],mi[20],digit[20];

inline void dp()

int a,amod,bmod;

for (int i=2;i<=10;++i)

for (int j=0;j<13;++j)

if (k==3) f[i][j][2]+=f[i-1][bmod][1]+f[i-1][bmod][2];} }

}inline int calc_ans(int n)

//如果前面已經符合條件,除去這一位所有的都可以加上

if (flag)

last+=mi[i-1]*digit[i];

continue;

}//如果上一位是1,這一位》3的話,要加上不含13但是開頭為3的

if (digit[i+1]==1&&digit[i]>3)

//如果這一位》1的話,要加上不含13但是開頭為3的

if (digit[i]>1)

if (digit[i]==3&&digit[i+1]==1) flag=true;

//最後加上這一位的數

last+=mi[i-1]*digit[i];

}return ans;

}int main()

學習筆記 訓練記錄 數字DP

數字dp,即對數字進行拆分,利用數字來轉移的一種dp,一般採用記憶化搜尋,或者是先預處理再進行轉移 乙個比較大略的思想就是可以對於給定的大數,進行按數字進行固定來轉移記錄答案 區間型別的,可以考慮字首和的思想,求 l,r 可以看做求 1,r 1,l 其實還有一種,是按照二進位制建一顆0,1樹來表示,...

HDU 3555 Bomb 基礎數字dp

題意大致就是說給你乙個數n,要你求0 n之間含有49的數的個數 理解題意很簡單下面就直接貼 了 include include include includeusing namespace std int64 dp 21 4 int a 1000 void init int main int g 0...

HDU 4734 基礎數字dp(遞推)

以前成都賽區的題目。題意很明顯,就是有乙個f x 的函式,然後給你乙個a和b求出在0 b中有多少小於等於f a 的,預處理出來dp i j k 中有多少小於等於k的。這裡採用遞推。因為我太弱了。遞迴總是寫錯。還需慢慢加深理解。ps.很醜。還是推薦遞迴。實在不會遞推也可以。蒟蒻加油!include i...