当前位置:   article > 正文

第十四届蓝桥杯大赛省赛Python——保险箱_蓝桥杯保险箱

蓝桥杯保险箱

一、问题描述

二、算法思想

本题涉及到最少次数问题,因可以考虑用贪心法或者是动态规划问题,但仔细分析题目,这个题目要求我们操作密码次数最小,我们可以将问题划分成一个个子问题,即求解每一位密码打到目标数字所需的最少操作步数,下一位密码在上一位密码最少操作步数的基础上再进行求解,很明显我们可以采取动态规划的算法,每一位密码达到目标状态可以有三种操作即不进位、不退位;通过进位通过退位,具体可看下图例子:

根据例子可以写出动态规划转移方程dp[ i ] [ j ],i表示第i位密码,j表示第j种状态,每一种状态在上一种状态上进行运算、比较

不进位、不退位:dp[i][0]=min(dp[i-1][0] + abs(x[i]-y[i]), dp[i-1][1] + abs(x[i]+1-y[i]), dp[i-1][2]+abs(x[i]-1-y[i]))

进位:dp[i][1]=min(dp[i-1][0] + 10-x[i]+y[i], dp[i-1][1] + 10-(x[i]+1)+y[i], dp[i-1][2] + 10-(x[i]-1)+y[i])

退位:dp[i][2]=min(dp[i-1][0] + 10-y[i]+x[i], dp[i-1][1] + 10-(y[i]-1)+x[i], dp[i-1][2] +10-(y[i]+1)+x[i])

二、代码实现(附注释)

  1. #保险箱(动态规划算法)
  2. n=int(input())
  3. x=[0]+list(map(int,list(input())))[::-1]#逆序,方便高位进位运算
  4. y=[0]+list(map(int,list(input())))[::-1]
  5. dp=[[0]*3 for i in range(n+1)]#生成dp数组
  6. #定义dp数组初始值
  7. dp[1][0]=abs(x[1]-y[1]) #不进位,不退位
  8. dp[1][1]=10-x[1]+y[1] #进位
  9. dp[1][2]=10-y[1]+x[1] #退位
  10. for i in range(2,n+1):
  11. dp[i][0]=min(dp[i-1][0] + abs(x[i]-y[i]), dp[i-1][1] + abs(x[i]+1-y[i]), dp[i-1][2]+abs(x[i]-1-y[i])) #不进位,不退位
  12. dp[i][1]=min(dp[i-1][0] + 10-x[i]+y[i], dp[i-1][1] + 10-(x[i]+1)+y[i], dp[i-1][2] + 10-(x[i]-1)+y[i]) #进位
  13. dp[i][2]=min(dp[i-1][0] + 10-y[i]+x[i], dp[i-1][1] + 10-(y[i]-1)+x[i], dp[i-1][2] +10-(y[i]+1)+x[i]) #退位
  14. # print(dp)
  15. print(min(dp[n][0],dp[n][1],dp[n][2]))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/790979
推荐阅读
相关标签
  

闽ICP备14008679号