状态机dp(Python)

状态机dp

例题 1:保险箱(蓝桥杯14届省赛真题)

小蓝有一个保险箱,保险箱上共有 n 位数字。小蓝可以任意调整保险箱上的每个数字,每一次操作可以将其中一位增加 1 或减少 1。当某位原本为 9 或 0 时可能会向前(左边)进位/退位,当最高位(左边第一位)上的数字变化时向前的进位或退位忽略。

例如:
00000 的第 5 位减 1 变为 99999;99999 的第 5 位减 1 变为 99998;00000 的第 4 位减 1 变为 99990;97993 的第 4 位加 1 变为 98003;99909 的第 3 位加 1 变为 00009。保险箱上一开始有一个数字 x,小蓝希望把它变成 y,这样才能打开它,问小蓝最少需要操作的次数。

输入格式:

输入的第一行包含一个整数 n。第二行包含一个 n 位整数 x。第三行包含一个 n 位整数 y。

输出格式:

输出一行包含一个整数表示答案。

数据范围:

对于 30 % 30\% 30% 的评测用例, 1 ≤ n ≤ 300 1≤n≤300 1n300
对于 60 % 60\% 60% 的评测用例, 1 ≤ n ≤ 3000 1≤n≤3000 1n3000
对于所有评测用例, 1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105,x,y 中仅包含数字 0 至 9,可能有前导零。

解题思路:

  • 核心在于当x与y的相应位之间的差距过大,可以通过向高位进位(借位)缩短距离
  • 需要注意进位借位虽然可以减少当前位上的修改次数,但可能导致高位上需要更多修改
  • 这种不确定性促使了dp的应用,否则程序将退化为贪心算法,无法保证求出最优解
  • 创建dp数组,存储的元素是从最低位到当前位将x变成y所需的修改次数
  • dp的下标有两个,一个用来标识位数,另一个用来表示当前位进位(借位)或直接修改所需的修改次数
n = int(input())
x = [int(i) for i in input()]
y = [int(i) for i in input()]
# dp[i][0]:第i位采用直接修改策略的前提下,区间[i:]所需的修改次数
# dp[i][1]:第i位采用向上进位策略的前提下,区间[i:]所需的修改次数
# dp[i][2]:第i位采用向上借位策略的前提下,区间[i:]所需的修改次数
dp = [[0]*3 for _ in range(n)]
# 特殊处理最低位
dp[n-1][0] = abs(x[n-1]-y[n-1])
dp[n-1][1] = abs(10+y[n-1]-x[n-1])
dp[n-1][2] = abs(10+x[n-1]-y[n-1])
# 从低位向高位搜索
for i in range(n-2,-1,-1):p = x[i]q = y[i]dp[i][0] = min(dp[i+1][0]+abs(p-q), dp[i+1][1]+abs(p+1-q), dp[i+1][2]+abs(p-1-q))dp[i][1] = min(dp[i+1][0]+abs(10+q-p), dp[i+1][1]+abs(10+q-p-1), dp[i+1][2]+abs(10+q-p+1))dp[i][2] = min(dp[i+1][0]+abs(10+p-q),dp[i+1][1]+abs(10+p+1-q),dp[i+1][2]+abs(10+p-1-q))
print(min(dp[0][0],dp[0][1],dp[0][2]))

例题 2:蜗牛(蓝桥杯14届省赛真题)

问题描述:

这天,一只蜗牛来到了二维坐标系的原点。 在 x 轴上长有 n 根竹竿。它们平行于 y 轴,底部纵坐标为 0 ,横坐标分别为 x 1 , x 2 , . . . , x n x_1, x_2,...,x_n x1,x2,...,xn 。竹竿的高度均为无限高,宽度可忽略。蜗牛想要从原点走到第 n 个竹竿的底部也就是坐标 ( x n , 0 ) (x_n , 0) (xn,0) 。它只能在 x 轴上或者竹竿上爬行,在 x 轴
上爬行速度为 1 单位每秒;由于受到引力影响,蜗牛在竹竿上向上和向下爬行 的速度分别为 0.7 单位每秒和 1.3 单位每秒。 为了快速到达目的地,它施展了魔法,在第 i 和 i + 1 根竹竿之间建立了传送门(0 < i < n ),如果蜗牛位于第 i 根竹竿的高度为 a i a_i ai 的位置 ( x i , a i ) (x_i, a_i) (xi,ai) ,就可以瞬间到达第 i+1 根竹竿的高度为 b i + 1 b_{i+1} bi+1 的位置 ( x i + 1 , b i + 1 ) (x_{i+1}, b_{i+1}) (xi+1,bi+1), 请计算蜗牛最少需要多少秒才能到达目的地。

输入格式:

输入共 1 + n 行,第一行为一个正整数 n ;
第二行为 n 个正整数 x 1 , x 2 , . . . , x n x_1 , x_2 , . . . , x_n x1,x2,...,xn
后面 n − 1 行,每行两个正整数 a i , b i + 1 a_i, b_{i+1} ai,bi+1

输出格式:

输出共一行,一个浮点数表示答案(四舍五入保留两位小数)。

# 状态机dp
# 内存超限
up = 0.7
down = 1.3
n = int(input())
x = [0] + [int(i) for i in input().split()]
a = [0]*(n+1)
b = [0]*(n+1)
for i in range(1,n):p,q = map(int,input().split())a[i] = pb[i+1] = q
# dp[i][0]:到达节点i所需要的最短时间
# dp[i][1]:到达第i个传送门所需要的最短时间
dp = [[0]*(n+1) for i in range(n+1)]
# 初始位置0
dp[1][0] = x[1]
dp[1][1] = x[1] + a[1]/up
for i in range(2,n+1):# 到达当前节点有四种方式(包含两个出发点和两条路径)d = x[i] - x[i-1]# 计算出从上一个传送终点 b[i-1] -> a[i-1] 的路径耗时temp = 0if b[i-1] > a[i-1]:# downtemp += (b[i-1]-a[i-1])/downelse:temp += (a[i-1]-b[i-1])/updp[i][0] = min(dp[i-1][0]+d,dp[i-1][0]+a[i-1]/up+b[i]/down,dp[i-1][1]+b[i-1]/down+d,dp[i-1][1]+temp+b[i]/down)dp[i][1] = min(dp[i-1][0]+d+b[i]/up,dp[i-1][0]+a[i-1]/up,dp[i-1][1]+b[i-1]/down+d+a[i]/up,dp[i-1][1]+temp)
print(f'{dp[n][0]:.2f}')
# 状态机dp + 滚动数组优化
up = 0.7
down = 1.3
n = int(input())
x = [0] + [int(i) for i in input().split()]
a = [0]*(n+1)
b = [0]*(n+1)
for i in range(1,n):p,q = map(int,input().split())a[i] = pb[i+1] = q
# dp[0]:到达节点i所需要的最短时间
# dp[1]:到达第i个传送门所需要的最短时间
dp = [0]*2
# 初始位置0
dp[0] = x[1]
dp[1] = x[1] + a[1]/up
for i in range(2,n+1):pre_0 = dp[0]pre_1 = dp[1]# 到达当前节点有四种方式(包含两个出发点和两条路径)d = x[i] - x[i-1]# 计算出从上一个传送终点 b[i-1] -> a[i-1] 的路径耗时temp = 0if b[i-1] > a[i-1]:# downtemp += (b[i-1]-a[i-1])/downelse:temp += (a[i-1]-b[i-1])/updp[0] = min(pre_0+d,pre_0+a[i-1]/up+b[i]/down,pre_1+b[i-1]/down+d,pre_1+temp+b[i]/down)dp[1] = min(pre_0+d+b[i]/up,pre_0+a[i-1]/up,pre_1+b[i-1]/down+d+a[i]/up,pre_1+temp)
print(f'{dp[0]:.2f}')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Logistic 回归为什么适用于二分类问题?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ Logistic 回归非常适用于二分类问题的主要原因在于它的核心机制和输出特性。首先&#xff0c;Logistic 回归模型基于概率的理念&#xff0c;通过 Sigmoid 函数转换输入特征的线性组合&#xff0c;将任意…

node部署代理服务器全流程

更多文章访问&#xff1a;node部署代理服务器全流程 – 夜空中最亮的星 启动node代理服务器&#xff1a; 安装nvm: 如何安装nvm使用nvm安装node服务&#xff0c;要求版本14以上安装node中间件&#xff1a;npm install express http-proxy-middlewarenode代码&#xff0c;所有…

Power Automate custom connector创建示例2-1

一、open power automate custom connector list&#xff1a; Microsoft Power Automate 二、edit custom connector info Authentication type have 4 choice. The example I tested requires Authorization validation, so I chose API Key.

东南亚印度越南菲律宾海外网红达人合作:TikTok与YouTube博主共创新风尚

【本篇由言同数字科技有限公司原创】在全球化的时代背景下&#xff0c;海外市场已成为众多品牌争夺的战略高地。而在这个竞争激烈的市场环境中&#xff0c;海外红人营销作为一种有效的品牌推广方式&#xff0c;越来越受到品牌营销者的青睐。本文将探索海外红人营销的方法论&…

Java异步注解@Async不生效的解决方案

问题分析 当我们在方法上加上Async注解时&#xff0c;我们希望此方法会在一个新的线程中执行&#xff0c;从而实现异步操作。但有时我们发现方法仍在主线程中执行&#xff0c;这就是异步注解没有生效&#xff0c;这种情况通常是Spring容器没有正确识别并管理异步方法的问题。 …

每日一读|经典美文摘抄——等待

等待&#xff0c;是我们和时间的一场博弈。我们凭借着智慧和耐力&#xff0c;与未来做一个交换。 等待的不可知性&#xff0c;是一份考验&#xff0c;一天一天&#xff0c;一步一步走向希望&#xff0c;或者失望。 安娜•卡列尼娜呼喊着&#xff0c;“我是人&#xff0c;我要生…

高新技术企业要满足什么条件

企业申报相信大家都有所了解&#xff0c;这是每个企业都需要做的一个项目。但是在近些年来政策的变化影响下。不少人对于相关的细节有了不少的问题。比如说高企申报怎么申报&#xff1f;新企业怎么进行高企申报&#xff1f; 成立年限&#xff1a;企业成立一年以上&#xff0c;…

day8字符串part01

总结 反转问题要活用双指针法&#xff0c;有效减少额外空间的使用 344.反转字符串 ● 541. 反转字符串II ● 卡码网&#xff1a;54.替换数字 ● 151.翻转字符串里的单词 ● 卡码网&#xff1a;55.右旋转字符串 344.反转字符串 /*344. 反转字符串简单 提示编写一个函数&…

VirtuoZo全数字摄影测量系统介绍

VirtuoZo&#xff0c;这一名字的背后蕴含着强大的技术与创新。它是由武汉大学遥感信息工程学院在张祖勋院士的主持下&#xff0c;经过十几年的努力研制成功的全数字化摄影测量系统。该系统不仅仅是一个技术产品&#xff0c;更是中国摄影测量领域的一次重大突破&#xff0c;标志…

jquery 实现倒计时

$(".tableText").click(function () { var time 60; var timer setInterval(function(){ time--; $(".tableText").text("&#xff08;"time"秒&#xff09;重发"); if(time0){ clearI…

工业垃圾打包机液压比例阀放大器

液压打包机的种类很多&#xff0c;我们生活中常见的是废纸打包机、金属打包机、纸箱打包机、玉米茎打包机等。然而&#xff0c;牙齿所有的打包机都有他的不同用法。除了我们生活中常见的以外&#xff0c;还有很多其他种类的打包机。让我介绍几件事。一种是捆 绑式打包机设备&am…

Spring事务:7种传播方式、4种隔离级别

Spring事务的代码承接jdbcTemplate的 文章目录 一、事务1.1 注解配置1.2 注解处理事务1.3 xml处理事务配置 二、传播方式三、事务的隔离级别 一、事务 不可分割的一系列操作。要么 全执行成功。要么 如果一个不成功&#xff0c;则全部不成功。 处理的事务的时候&#xff0c;成…

QT——第一个项目(HelloWorld)

QT——第一个项目&#xff08;HelloWorld&#xff09; 通过控件创建通过代码的方式实现对象树自己观察 我们之前对QT有了一定的了解&#xff0c;今天我们要用QT来写一段经典代码&#xff1a;HelloWorld。如果还没有看过前两次QT初识的小伙伴可以点击这里&#xff1a; https://b…

CentOS安装MeterSphere并实现无公网IP远程访问本地测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

沉浸又护眼!观影爱好者的最佳CP“星光S1”4月6日开售

据悉&#xff0c;海信激光电视将在4月6日举行线上发布会。除3月已经开售、配备可折叠屏幕的星光S1 100英寸外&#xff0c;本次发布会还将发布星光S1 75英寸、80英寸、88英寸全系版本&#xff0c;为不同用户实现院线级家庭观影体验。 高色域&#xff0c;一直是新一代显示技术的…

Flux 和 Mono区别:并发并行同步异步区别

Flux 和 Mono区别 在工作中&#xff0c;看到导师写项目的时候用到了Flux和Mono。知识盲区了。随后去查了相关的技术信息。很遗憾说的有点太官方了。没有看懂。中午就餐之后&#xff0c;就问导师这两个是什么意思&#xff0c;以及什么区别。废话不多说&#xff0c;总结一下&…

每日一练 | 华为认证真题练习Day213

1、下面哪些OSPF状态迁移是可能的&#xff08;多选&#xff09; A. DOWN->INIT B. DOWN->2-WAY C. LOADING->FULL D. INIT->2-WAY 2、如果需要在某网段上进行快速失效检测机制&#xff0c;则在下列可能实现的配置方法中&#xff0c;描述错误的是:&#xff08;多…

LeetCode - 1702. 修改后的最大二进制字符串

文章目录 解析AC CODE 题目链接&#xff1a;LeetCode - 1702. 修改后的最大二进制字符串 解析 详细题解&#xff1a;贪心&#xff0c;简洁写法&#xff08;Python/Java/C/Go/JS/Rust&#xff09; 思路很牛b。 简单来说我们需要想办法将0配对&#xff0c;将其变为10&#xff0…

K8S:常用资源对象操作

文章目录 一、使用Replication Controller(RC)、Replica Set(RS) 管理Pod1 Replication Controller&#xff08;RC&#xff09;2 Replication Set&#xff08;RS&#xff09; 二、Deployment的使用1 创建2 滚动升级3 回滚Deployment三、 Pod 自动扩缩容HPA1 使用kubectl autosc…

React + three.js 3D模型骨骼绑定

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定 项目代码(github)&#xff1a;https://github.com/couchette/simple-react-three-skeleton-demo 项目代码(gitcode)&#xff1a;https://gitcode.com/qq_41456316/simple-r…