首页 技术 正文
技术 2022年11月12日
0 收藏 684 点赞 2,219 浏览 909 个字

跟着洛谷日报走,算法习题全都有!

嗯,没错,这次我也是看了洛谷日报的第84期才学会这种算法的,也感谢Mathison大佬,素不相识,却写了一长篇文章来帮助我学习这个算法。

算法思路:

感觉dfs版的数位dp还是挺简单的,直接dp然后递推统计答案的那种比它搞脑子多了。

在dfs版本中,我们需要特别注意的地方有两个:

1、是否贴上界:

这是个啥呢?

很简单,给大家举个栗子,假如我们要求解1-12345这段区间,如果我们已经做了3位,而前三位正好是123,那么我们第4位就只能取0-5,否则我们就可以取0-9。

2、有没有前导零:

这有为啥要特殊记呢?

因为前导零会影响我们对合法方案的统计。

当现在的状态有前导零,或者贴上界的时候我们就不能记忆化,因为它们是与别的状态不同的,不同之处就是上面讲的那些啦。

dfs模板:

function dfs(pos,...,lead,flag:Longint):int64;
var
res:int64;
i,limit:Longint;
begin
//pos:当前在做第几位。
//lead:0/1 有/没有 前导零
//flag:0/1 是/否 贴上界
if pos>len then exit(...);
......
...... //各种优化
if (dp[pos][...]<>-1)and(lead+flag=0) then exit(dp[pos][...]); //记忆化
if flag=1 then limit:=a[len-pos+1] else limit:=9; //最高枚举到几
res:=0;
for i:=0 to limit do
res:=res+dfs(pos+1,...,...,ord((lead=1)and(i=0)),ord((flag=1)and(i=limit)));
if lead+flag=0 then dp[pos][...]:=res;
dfs:=res;
end;
function part(x:int64):int64; //数位分离
begin
len:=0; part:=0;while x>0 do
begin inc(len); a[len]:=x mod 10; x:=x div 10; end;
part:=dfs(1,...,1,1);end;
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,490
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,905
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,738
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,491
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,129
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,292