数位dp算法——洛谷p1980

这篇博客介绍了如何使用动态规划解决一个计数问题,即在一个整数中计算目标数 num 出现的次数。通过创建 dp 数组来存储部分解决方案,从个位开始遍历,递推计算符合条件的数的数量。适用于0-9范围内数字的组合,适用于编程竞赛或算法学习
摘要由CSDN通过智能技术生成
 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();//右边界
        int num=sc.nextInt();//目标数
        int[][] dp=new int[n/10+1][10];//i表示前几位,j表示个位,dp[i][j]表示某个数含有num的个数
        int ans=0;
        for (int i = 0; i <n/10+1 ; i++) {
            for (int j = 0; j<10&&i*10+j<=n; j++) {
                if(i==0){//<10的数不计0
                    if(j==num&&num!=0)
                        dp[i][j]=1;
                }else {
                    if(j==num)//判断个位是否==num
                        dp[i][j]=dp[i/10][i%10]+1;
                    else dp[i][j]=dp[i/10][i%10];
                }
                ans+=dp[i][j];//累加
            }
        }
        System.out.println(ans);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值