int dfs(int i, int s, bool e) {
if (i==-1) return s==target_s;
if (!e && ~f[i][s]) return f[i][s];
int res = 0;
int u = 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.
数位dp模版
最新推荐文章于 2024-02-26 20:36:59 发布
本文介绍了一种使用递归状态机进行数字字符串匹配的方法。通过记忆化搜索减少重复计算,并利用布尔标志判断是否达到边界条件。该方法适用于解决特定类型的数字状态转移问题。
1367

被折叠的 条评论
为什么被折叠?



