codeforces (數字dp 記憶化搜尋)

2021-06-22 22:46:35 字數 983 閱讀 9476

題意:列舉[a,b]之間的beautiful數(即這個數所有位上的數都能整除這個數)

思路: 用pos記錄位置  num記錄當前位置前面所有位組成的數 當時開不了這麼大的陣列  有知道1-9 的最小公倍數是2520 所以num記錄 上文的num%2520 就可以了 現在就剩下記錄當前位置前面各位都出現過0-9中的哪些數字了  我用s存前面出現過哪些數字 s的二進位制各位分別對應各個數字

s二進位制的位置: 9876 54321 0

0-9: 98765 43210       

這樣s的二進位制數就能把num各位是否出現過記錄下來

eg:num=14673111163

9876 54321 0

s(二進位制):0 01101 1010           num各位出現了1,3,4,6,7, 則s的二進位制中第1,3,4,6,7,位標記為1 表示出現過其他位標記為0 表示沒出現過

但是 這樣還是會超記憶體  幸好 0 不能做分母 1 能整除任何數  所以s中不用標記0,1 是否出現過  那麼s 的二進位制可以變為8位分別對應

s二進位制的位置: 7 65432 10

0-9: 98765 432

這樣就不會超記憶體了

見別人也有用離散化的 

但是還是喜歡自己的狀態壓縮存

//數字dp 記憶化搜尋

//#include#include__int64 dp[30][3000][256];//dp[pos][num][s] 存位置為pos 前面l-pos位數對2520取餘後的值 前面各位上出現的數字的狀態

int digit[30];//存各位數字

int ok(int num,int s)//判斷當前列舉的數字的各位數字 是否能整除num(當前列舉的數對2520取餘後的餘數)

return dfs(l-1,0,0,1)-1;// 減一是為了減去全為0的情況

}int main()

return 0;

}

數字DP入門 數字DP模板

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

數字dp模版(dp)

1 include 2 include 3 include 4 include 5 6using namespace std 78 intt 9long long dp 19 19 2005 10 long long l,r 11int shu 20 12 13long long dfs int l...

codeforces 731E 優先佇列 DP

題意 給出n個數字,a和b兩個人依次選中1 k k 2 把他們合併之後自己分數加上這些數的和。求兩個人在最右策略下a最多領先b多少。當數字只剩下乙個之後遊戲馬上結束。用 dp i 0 1 表示前i個數字被合併,現在是a b先手到最後遊戲結束最多領先多少。故a要最大化後繼狀態的值,b要最小化後繼狀態的...