目录
一.题目
分析:给了一个整数n,能对其每一位数进行加或减操作,最后求最大的结果
首先要定义一个数组来存储每一位数,那我们肯定首先想到贪心算法,保证前几位数最大就可以
二.代码
public class Main {
public static long max = 0;
public static int indx = 0;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
long n = scan.nextLong();//初始数字
int a = scan.nextInt();//加
int b = scan.nextInt();//减
int[] arr = new int[20];//最长位数
int index = 0;//记录有多少位
max = n;
//将这个数的每一位提取出来
while(n>0)
{
arr[index++] = (int)(n % 10);
n = n / 10;
}
index--;
indx = index;
dfs(arr,index,a,b);
System.out.println(max);
scan.close();
}
//要用dfs应该是每次只用一次加或者只用一次减,然后通过回溯来遍历所有可能结果
public static void dfs(int[] array,int index,int a,int b)
{
//输出语句
if(index==-1)
{
long res = 0;
for(int i = indx;i>=0;i--)
{
res = array[i] + res * 10;
}
if(res>max)
max = res;
return;
}
//模拟语句,只要保证前几位数字最大就好,dfs+贪心的一道题,难点:贪心
//首先考虑a操作,核心就是能不能让数字比原来大
//核心问题:加了之后是否比本身大?,减了之后是否比本身大
int cnt = Math.min(9-array[index],a);
array[index] = array[index] + cnt;
a = a - cnt;
dfs(array,index-1,a,b);
a = a + cnt;
array[index] = array[index] - cnt;
//只有能减到9才会变大,否则都是减少
if(b-(array[index]+1)>=0)
{
int tmp = array[index]+1;//需要减的次数
array[index] = 9;
b = b - tmp;
dfs(array,index-1,a,b);
array[index] = tmp - 1;
b = b + tmp;
}
else
dfs(array,index-1,a,b);
}
}
三.做题时的错误点
1.没对最后一位进行操作
2.每一位数一定是有三种操作,加法,减法,不操作,dfs就是遍历所有可能,贪心算法减少了树的宽度,算是优化,所以有几种可能就需要几次递归,但需要注意回溯