数位dp专题
本质上就是动态规划,只需记录位数和前一个数的状态,其后满足条件的个数是固定的
数位dp还要多记录一个受限状态,以及前面全为0的特殊处理状态
处理范围内的数时,相当于利用前缀和的思想进行处理
我们可以用f(n)表示[0,n]的所有满足条件的个数,我们对于[l,r] 区间内满足条件的个数,就可以用[l,r] ⟺ f (r)−f(l−1)
数位dp模板
auto s = to_string(n); //转字符串逐位递归分析
int m = s.length(), memo[m][10];
memset(memo,-1,sizeof(memo));
function<int(int, int, bool)> f = [&](int i,int mask, bool is_limit,bool is_num) -> int {//视情况记录已遍历值的某种特征,如1的个数,mask状态,
if (i == m)
return is_num;//边界直接返回前面累积的1
if (!is_limit&&is_nummemo[i][mask]!= -1) //已经存储过,直接剪枝返回,核心语句,记忆化搜索
return memo[i][mask];
int res = 0; //计算1出现的个数
if(!is_num) res = f(i + 1, mask, false, false);//处理特殊情况
int up = is_limit ? s[i] - '0' : 9; // 根据受限与否决定枚举数上界
int down = is_num? 0: 1;//根据特殊情况与否决定下界
//做选择
for (int d = down; d <= up; ++d)
res += f(i + 1, d, is_limit && d == up,true);//移动到下一位
if (!is_limit&&is_num) //记录非限制数
memo[i][mask] = res;
return res;
};
return f(0,0,true,false); //从下标0开始,刚开始受限
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2022-06-04 Pandas