恩是的没错数位DP的奥义就是一个简练的dfs模板
1 int dfs(int position, int condition, bool boundary) { 2 if (position < 0) return (condition ?); 3 if (condition < 0) return 0; 4 if (!boundary && ~f[position][condition]) return f[position][condition]; 5 int respond = 0; 6 int top = boundary ? num[position] : 9; 7 for (int i = 0; i <= top; ++i) 8 respond += dfs(position - 1, new_s(condition, i), boundary && i == top); 9 return boundary ? respond : f[position][condition] = respond; 10 }
f是记忆化数组 其他看变量名就知道意思了吧
核心在于return里condition的条件以及new_s(condition, i)的构造方式
i从0还是1开始计数还要考虑题目里的前缀0条件
简化版
int dfs(int pos, int con, bool e) { if (pos < 0) return (con ?); if (con < 0) return 0; if (!e && ~f[pos][con]) return f[pos][con]; int res = 0; int top = e ? num[pos] : 9; for (int i = 0; i <= top; ++i) res += dfs(pos - 1, new_s(con, i), e && i == top); return e ? res : f[pos][con] = res; }
以及血的教训 多数情况dfs出来的f的数据是通用的 不用每次输入都memset掉
会TLE!!!
参考资料:http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html