數位DP 題集
/*-------------------------------------------------------------------------*/
常用數位DP寫法:
int dfs(int i, int s, bool e) { if(i==-1) return s==target_s; if(!e && ~f[i][s]) return f[i][s]; intres = 0; intu = e?num[i]:9; for(int d = first?1:0; d <= u; ++d) res += dfs(i-1, new_s(s, d), e&&d==u); return e?res:f[i][s]=res;}
其中:
f為記憶化數組;
i為當前處理串的第i位(權重標記法,也即後面剩下i+1位待填數);
s為之前數位狀態(如果要求後面的數滿足什麼狀態,也可以再記一個目標狀態t之類,for的時候枚舉下t);
e表示之前的數是否是上界的首碼(即後面的數能否任意填)。
for迴圈枚舉數字時,要注意是否能枚舉0,以及0對於狀態的影響,有的題目前置0和中間的0是等價的,但有的不是,對於後者可以在dfs時再加一個狀態變數z,表示前面是否全部是前置0,也可以看是否是首位,然後外面統計時候枚舉一下位元。It depends.
於是關鍵就在怎麼設計狀態。當然做多了之後狀態一眼就可以瞄出來
。
注意:
不滿足區間減法性質的話(如hdu 4376),不能用solve(r)-solve(l-1),狀態設計會更加詭異。
/*-------------------------------------------------------------------------*/
hdu2089 不要62
Hdu3555不能出現連續的49
UESTC 1307相鄰的數差大於等於2
HDU 3652 出現13,而且能被13整除。
HDU 3709 平衡數
light OJ 1140兩個數之間的所有數中零的個數。
lightoj 1032 位元中連續兩個‘1’出現次數的和
Codeforces 55D. Beautiful numbers
POJ 3252 Round Number (組合數)
LightOJ 1068 能被K整數且各位元字之和也能被K整除的數
LightOJ1205求區間[a,b]的迴文數個數。
hdu3886求滿足符號串的數字個數。
HDU4352嚴格上升子序列的長度為K的個數。
ural 1057 數位統計
codeforces215E周期數
codeforces258B在1-m中任選7個數,要使前六個數字中的“4”,"7"之和小於第七個的,
HDU4507 和7無關數的平方和
Zoj2599 數位統計(見題意)
zoj3162分形、自相似
ZOJ3494 BCD Code(AC自動機+數位DP)
/*-------------------------------------------------------------------------*/