DFS进阶——最大数字

本文介绍了一种通过递归深度优先搜索(DFS)解决最大数字问题的方法,涉及操作1的加法和操作2的减法,同时受到次数限制。通过遍历每位数字并灵活运用加减,找到在给定次数内可能达到的最大值。

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

最大数字
题目分析

我要求经过一系列操作后可以得到的最大数字,每个操作都有次数限制,我们依次去看这些操作哈,

操作1:假设对于每一位我是从最高位依次向最低位遍历的,对某一位加1,那么加都加了,我们希望把这一位加到最大值也就是9,但是也有可能加不到9,因为我的操作有次数限制,所以就是在9和n之间选一个最小值,那么就是加法的操作次数,如下代码,c表示当前这一位的值,t就是对于当前位来说我能够加的次数,那么n就是可以加的总次数,经过此次操作后,加的总次数要减掉t。j表示前step-1位得到的值,那么遍历完这一位之后,前step位得到的值就是j*10+c+t。

private static void dfs(int step, long j) {
    ......
    int t = Math.min(n, 9 - c);//尽可能的加到9,但是还要考虑我的n可能次数不够了
    n -= t;//减去加操作使用的次数
    dfs(step+1, j*10+c+t);
    n +=t;//回溯,要复原
    ...... 
}

操作2:假设对于每一位我是从最高位依次向最低位遍历的,对某一位减1,那么我要么给他减到9,要么一点都别减。所有只有当我确定我可以减到9时,我才执行减操作。

//减操作,判断是否可以进行,不可以就一步不可进行
if(m > c) {
    m -= c+1;
    dfs(step+1, j*10+9);
    //回溯
    m += c+1;
} 

当遍历到最后一位时,此时获得的数字的值就确定了,那么我就拿它和我之间记录的答案比较,取一个最大值就可以了。

if(step==a.length()) {
    ans = Math.max(ans, j);
    return;
}

这里我用字符串存的数字,目的是我可以快速的得到某一位上的值。全部代码如下,

题目代码
import java.util.Scanner;
public class Main {
    static long ans = 0;
    static String a;
    static int n;
    static int m;
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    a = scanner.next();
    n = scanner.nextInt();
    m = scanner.nextInt();
    dfs(0,0);
    System.out.println(ans);
}
private static void dfs(int step, long j) {
    // TODO Auto-generated method stub
	if(step==a.length()) {
		 ans = Math.max(ans, j);
		 return;
	}
    int c = a.charAt(step)-'0';
    //加操作
    int t = Math.min(n, 9 - c);//尽可能的加到9,但是还要考虑我的n可能次数不够了
    n -= t;//减去加操作使用的次数
    dfs(step+1, j*10+c+t);
    //回溯时,不要忘记复原n
    n += t;
    //减操作,判断是否可以进行,不可以就一步不可进行
    if(m > c) {
        m -= c+1;
        dfs(step+1, j*10+9);
        //回溯
        m += c+1;
    }    
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值