hdu3555 模板化數字dp

2021-07-11 07:11:32 字數 1657 閱讀 4962

/**********************jibancanyang**************************

*author :jibancanyang

*created time : 五 4/15 23:43:25 2016

*file name : hdu3555 .cpp

*problem:典型數字dp

*get:上次切這個題用的是水過去的方法,這次用模板化的dfs寫了下,其方法本質就是一位一位的增加數字.

*並且設定了乙個limit的狀態記錄,來記錄前面的數是否是邊界,如果是邊界那麼當前位只能最大是bit[i],而不能

*0 ~ 9的隨便取了.然後注意的是這裡是統計的到0的情況.

***********************[email protected]**********************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef pair pii;

typedef

long

long ll;

typedef

unsigned

long

long ull;

vector

vi;

#define pr(x) cout << #x << ": " << x << " "

#define pl(x) cout << #x << ": " << x << endl;

#define xx first

#define yy second

#define sa(n) scanf("%d", &(n))

#define rep(i, a, n) for (int i = a; i < n; i++)

#define vep(c) for(decltype((c).begin() ) it = (c).begin(); it != (c).end(); it++)

const

int mod = int(1e9) + 7, inf = 0x3fffffff, maxn = 1e5 + 12;

int t;

ll n, dp[25][2];

int bits[25];

#define limit asdf

ll dfs(int len, bool four, bool limit)

//pr(len), pr(four), pr(limit), pl(ret);

if (!limit) dp[len][four] = ret;

return ret;

}ll solve(ll n)

return dfs(t - 1, false, true);

}int main(void)

return

0;}

hdu 3555 數字dp入門

題意 給定乙個long long型別能夠存下的數字n,統計1 n之間含有49的數字的個數 思路 初始版本 需要記錄當前位置,前一位置放了那個數字,當前是否已經包含49,是否有上界這四個資訊,也就是dfs的四個引數。dfs pos,pre,istrue,limit 其實這種做法有點相當於把普通的數字d...

hdu3555 數字dp 入門

題目大意 給乙個數字n,範圍在1 2 63 1,求1 n之間含有49的數字有多少個。思路 狀態轉移 dp i 0 代表長度為 i 並且不含有49的數字的個數 dp i 1 代表長度為 i 並且不含有49,但是最高位是9的數字的個數 dp i 2 代表長度為 i 並且含有49的數字的個數。陣列 a i...

hdu3555(數字dp記憶化搜尋)

記憶化搜尋解法 include include int64 dp 25 3 dp pos pre pos記錄位數 pre記錄字首狀態0表示字首不包含49且pos 1不是4 1表示字首不包含49且pos 1位是4 2表示字首包含49 int digit 25 存數的各位上的數字 int l 存數的位數...