蓝桥杯不知道叫什么标题

打印 上一主题 下一主题

主题 805|帖子 805|积分 2415

小蓝有一个整数,初始值为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,完成基准情况即可。
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int mem[200000];
  5. int Mnum(int k)
  6. {
  7.         int t,M = -1e6;
  8.         while(k)
  9.         {
  10.                 t = k % 10;
  11.                 M = max(M,t);
  12.                 k = k/10;
  13.         }
  14.         return M;
  15. }
  16. int dfs(int x)//当前为x数字
  17. {
  18.          if(x == 2024)
  19.          return 0;
  20.          int sum = 1e6;
  21.          if(mem[x])
  22.          return mem[x];
  23.          if(x * 2 <= 2024)
  24.          sum = min(sum,dfs(x*2)+10);
  25.          
  26.          if(x + Mnum(x) <= 2024)
  27.          sum = min(sum,dfs(x+Mnum(x))+3);
  28.          
  29.          if(x + 1 <= 2024)
  30.      sum = min(sum,dfs(x+1)+1);
  31.      
  32.          mem[x] = sum;
  33.          return sum;
  34. }
  35. int main(void)
  36. {
  37.         cout << dfs(1);
  38.         return 0;
  39. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表