码迷,mamicode.com
首页 > 其他好文 > 详细

数位DP之奥义

时间:2016-05-24 19:14:10      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

恩是的没错数位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

 

数位DP之奥义

标签:

原文地址:http://www.cnblogs.com/quasar/p/5524375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!