失踪百景

惯性生存者

导航

数位DP之奥义

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

 

posted on 2016-05-24 18:06  失踪百景  阅读(164)  评论(0编辑  收藏  举报