数位DP之奥义

Posted 失踪百景

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数位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

 

以上是关于数位DP之奥义的主要内容,如果未能解决你的问题,请参考以下文章

数位dp专题之Beautiful numbers

数位dp专题之Beautiful numbers

BZOJ1026 [SCOI2009]windy数 数位dp

专题训练之数位DP

数位dp之f(x)

[模板] 数位dp