ANOI 2009 【同类分布】

本文深入探讨了数位DP(动态规划)的实战应用,通过分析一道题目,详细讲解了如何利用暴力枚举的方法求解,并给出了具体的代码实现。文章强调了状态设计的重要性,展示了dp数组的使用以及dfs(深度优先搜索)的递归调用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好累啊啊啊~~~~~~,刷了一天的题了,嗯,再写两篇题解我就去颓Slay。。。

思路分析:

刚刚我们讲了数位DP,现在就感受一下吧。(其实我也就只敢做做安徽的题,四川的数位DP想都不敢想)

嗯好,我们开始分析题目吧!

这题怎么说呢,额,——很暴力,嗯,非常暴力,暴力到我都不敢去想,(可以说它和大暴力只相差了一个苗条的YLK),然而它是能过的。

怎么个暴力法呢?

                      ——直接暴力枚举面积枚举这个数各个数位相加的和,够暴力吧!

开始设计状态(然而我们写的是dfs,其实是一样的),dp[pos][p][sum]表示当前已经做到了pos位,模我们枚举的各个数位的和的余数为p,当前各数位相加和为sum。

做dfs的时候只要当pos>len且p=0,sum=我们枚举的各个数位之和,就代表这是一种合法的方案。

代码实现:

var
    dp:array[1..20,0..180,0..180] of int64;
    a:array[1..20] of Integer;
    i,len,oo:Longint;
    ans,l,r:int64;
function dfs(pos,p,sum,lead,flag:Longint):int64;
var
    res:int64;
    i,limit:Longint;
begin
    if pos>len then
        if (sum=oo)and(p=0) then exit(1) else exit(0);
    if sum>oo then exit(0);
    if (dp[pos][p][sum]<>-1)and(lead+flag=0) then exit(dp[pos][p][sum]);
    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,(p*10+i)mod oo,sum+i,ord((lead=1)and(i=0)),ord((flag=1)and(i=limit)));
    if lead+flag=0 then dp[pos][p][sum]:=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;
    for oo:=1 to len*9 do
    begin
        fillchar(dp,sizeof(dp),255);
        part:=part+dfs(1,0,0,1,1);
    end;
end;
begin
    read(l,r);
    ans:=ans-part(l-1)+part(r);
    writeln(ans);
end.

转载于:https://www.cnblogs.com/WR-Eternity/p/9931415.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值