蓝桥杯不知道叫什么题目

小蓝有一个整数,初始值为1,他可以花费一些代价对这个整数进行变换。

小蓝可以花贵1的代价将教数增加1。

小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍,

例如,如果整数为16花费3将整数变为22,

又如,如果整数为22花费1将整数变为33,

又如,如果整数为23,花费10将整数为 46。

请问,如果要将整数从初始值1变为 2024,请问限少需要多代价?

思路:注意!!!!只能从1开始推到2024,因为其中有一个状态方程是要求取出当前数字最大数字(1~9),所以倒着写是不可行的。另外还要写一个函数取出当前数字里面的最大数字(1~9)。。记忆化搜索,正常写出所有推出状态的方程,并且每次要重置一个非常大的值比大小,每个状态方程的边界要写清楚。当x == 2024的时候返回0,完成基准情况即可。

复制代码
#include<iostream>
#include<algorithm> 
using namespace std;
int mem[200000];
int Mnum(int k)
{
	int t,M = -1e6;
	while(k)
	{
		t = k % 10;
		M = max(M,t);
		k = k/10;
	}
	return M;
}
int dfs(int x)//当前为x数字 
{
	 if(x == 2024)
	 return 0;
	 int sum = 1e6;
	 if(mem[x])
	 return mem[x];

	 if(x * 2 <= 2024)
	 sum = min(sum,dfs(x*2)+10);
	 
	 if(x + Mnum(x) <= 2024)
	 sum = min(sum,dfs(x+Mnum(x))+3);
	 
	 if(x + 1 <= 2024)
     sum = min(sum,dfs(x+1)+1);
     
	 mem[x] = sum;
	 return sum;
}
int main(void)
{
	cout << dfs(1);
	return 0;
}
相关推荐
Dream it possible!19 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
心抵鹊20 小时前
算法之双指针系列(一)
算法·leetcode
十二20 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
小此方21 小时前
[算法实战论:动态规划]回文串问题的dp解法,回文串问题的母题,以及以此为基础的派生题
算法·动态规划
Pniubi21 小时前
力扣560.和为k的子数组
算法·leetcode·职场和发展
D e re k ZH1 天前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
Pniubi1 天前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展
東隅已逝,桑榆非晚1 天前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
Eyfcom1 天前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
bro_Java6661 天前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法