題意:列舉[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要最小化後繼狀態的...