洛谷 P3842 [TJOI2007] 线段 题解

题目大意

原题链接

给你一个大小为 \(n \times n\)矩阵,上面有 \(n\) 条线段(一行一条)。你只能向右,向下,向左走。每一条线段都必须完整的经过。请问从 \((1,1)\)\((n,n)\) 最短路径长度是多少?

解法

这道题可以使用最短路或者DP来做。我觉得DP本题更简单一点所以我这里用的是DP。

可以设 \(dp_{i,0/1}\) 表示目前我已经看到第 \(i\) 行现在处于这条线段上的左边左端点还是右端点。(\(0\) 为左端点,\(1\) 为右端点)

于是我们就可以想到最初步的方法:每一次枚举从上一行的线段的左端点来还是右端点来,然后直接从选那个端点到当前的线段的左右个端点。即(以 \(dp_{i,0}\) 为例子):

\(dp_{i,0}=\min(dp_{i-1,0}+|l_{i-1}-l_{i}|,dp_{i-1,1}+|r_{i-1}-l_i|)+1\)

然后样例都没过,呜呜
就不放代码了

我们想想我们少了些什么?我们不能保证每一个线段到我们都完整的走过去。那我们应该怎么走呢?如下图:

image

沿着这个我们又可以得出新的DP方程(以 \(dp_{i,0}\) 为例):

\(dp_{i,0}=\min(dp_{i-1,0}+|l_{i-1}-r_i|+r_i-l_i+1,dp_{i-1,1}+abs(r_{i-1}-r_i)+r_i-l_i+1)\)

得到代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e4+5;
int l[maxn],r[maxn],dp[maxn][2];
signed main()
{ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n;cin>>n;for(int i=1;i<=n;i++) cin>>l[i]>>r[i];dp[1][0]=r[1]+r[1]-l[1]-1,dp[1][1]=r[1]-1;//初始化for(int i=2;i<=n;i++){dp[i][0]=min(dp[i-1][0]+abs(l[i-1]-r[i])+r[i]-l[i],dp[i-1][1]+abs(r[i-1]-r[i])+r[i]-l[i])+1;dp[i][1]=min(dp[i-1][1]+abs(l[i-1]-l[i])+r[i]-l[i],dp[i-1][1]+abs(r[i-1]-l[i])+r[i]-l[i])+1;}cout<<min(dp[n][0],dp[n][1])+r[n]-l[n];//最后一次我们还没考虑return 0;
}

上洛古一交,得到:

image

14分

还少了点什么?原来我们的初始化和最后一次也不对。具体的可以见下图:

image

最后一次(答案):

image

于是修改一下初始化:

\(dp_{1,0}=r_1+r_1-l_1-1,dp_{1,1}=r_1-1\)

最后一行(答案):

\(\min(dp_{n,0}+n-l_n,dp_{n,1}+n-r_n)\)

真正的AC代码:终于完了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e4+5;
int l[maxn],r[maxn],dp[maxn][2];
signed main()
{ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n;cin>>n;for(int i=1;i<=n;i++) cin>>l[i]>>r[i];dp[1][0]=r[1]+r[1]-l[1]-1,dp[1][1]=r[1]-1;for(int i=2;i<=n;i++){dp[i][0]=min(dp[i-1][0]+abs(l[i-1]-r[i])+r[i]-l[i]+1,dp[i-1][1]+abs(r[i-1]-r[i])+r[i]-l[i]+1);dp[i][1]=min(dp[i-1][0]+abs(l[i-1]-l[i])+r[i]-l[i]+1,dp[i-1][1]+abs(r[i-1]-l[i])+r[i]-l[i]+1);}cout<<min(dp[n][0]+n-l[n],dp[n][1]+n-r[n]);return 0;
}

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

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

相关文章

数据降维技术研究:Karhunen-Love展开与快速傅里叶变换的理论基础及应用

在现代科学计算和数据分析领域,数据降维与压缩技术对于处理高维数据具有重要意义。本文主要探讨两种基础而重要的数学工具:Karhunen-Love展开(KLE)和快速傅里叶变换(FFT)。通过分析这两种方法的理论基础和应用特点,阐述它们在数据降维中的优势和适用场景。 Karhunen-Lov…

一个Python GC的小Bug

这个代码是在看了“码农高天”的视频照模仿的。虽然 GC 能完成大部分内存管理的工作,但是基于性能计数器的GC确实存在小 Bug,这一点还是需要通过del和gc.collect手动管理。 from typing import Optionalclass Object:def __init__(self, name: str) -> None:self.obj: Opt…

2月做题记录

还有一个月。2月做题记录✩ trick ✯ 会大部分,要\(tj\)提示 ✬ 会小部分/完全没想到,看了\(tj\)才会 ◈ 脑电波 ✡ 有某一算法的神秘通用性质 ⊗ 待补目录2月做题记录字符串CF1827CCF1913FP10716P11150 ✩✯树[NOI2021] 轻重边做法1 ✩做法2做法3 ✡《简单树剖练习题》[QOJ9…

第六节 特征提取和无监督学习

没有标签y依旧提取出特征你的模型朝着哪个方向压缩特征,由你的标签来定自监督学习:从x中提取一部分作为自己的标签y,然后用x预测y 在自监督学习中,需要根据数据的特点设计一些自监督任务,这些任务通常基于数据的一些内在属性或关系来构建。例如,在图像数据中,可以设计图像…

产线MES 和 车间MES的区别与联系

制造执行系统(MES)在现代制造业中扮演着至关重要的角色,它连接着企业的计划层与生产现场,推动生产效率提升和质量管控强化。本文将深入探讨产线级MES和车间级MES的区别与联系,帮助读者更好地理解这两种MES系统如何协同工作,共同提升企业的生产管理水平。制造执行系统(ME…

CF995

A link如果选择这一天做题可以让差增加(即我这一天的题数大于他下一天的题数),则选;否则不选。 特殊的,另一个人地\(n+1\)天我们钦定他做了\(0\)道题。点击查看代码 #include<bits/stdc++.h>using namespace std;int n; int a[105],b[105];void qwq(){cin >> …

【qt】1个导航栏实现

//设定可增加按钮最大数量 void setBtnCountMax(int maxCount); const int btnCountMax() const;//设定背景颜色 void setBackGround(QColor bgcolor=QColor("black")); //设定按钮最小宽度 void setButtonMinWidth(int w); //设定内边距 void setPaddings(int left,…

09. Shell脚本

一、什么是ShellShell 是操作系统中的一个 命令行解释器,主要功能是接收用户命令,然后将这些命令传递给操作系统内核去执行。 Shell 是用户与操作系统内核之间的接口,它允许用户通过命令行或脚本来与操作系统进行交互。同时,Shell 也是一种脚本语言,允许用户编写一系列命令…

Maven安装、配置以及Idea使用本地Maven仓库

Maven的安装和配置 Maven是Java项目常用的依赖管理和构建工具,项目使用Maven的一个特点就是包含一个pom.xml文件。实际上,Idea在安装时会集成一个Maven,这里不使用这个集成的,而是记录一下如何在机器上单独安装并配置好。 首先,需要安装好jdk。然后,到搜索引擎上搜索Mave…

DeepSeek逆天,核心是 知识蒸馏(Knowledge Distillation, KD),一项 AI 领域的关键技术

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

Java初学者笔记-12、前端开发基础

未完待续 Web 三个组成部分:HTML:负责网页的结构(页面元素和内容)。 CSS:负责网页的表现(页面元素的外观、位置等页面样式,如:颜色、大小等)。 Javascript:负责网页的行为(交互效果)。高级技术:基于JS封装而来的高级框架——vue。 基于vue的桌面端组件库——Eleme…

Java笔记-13、Web后端基础 Maven

Maven是一款用于管理和构建Java项目的工具,是apache旗下的一个开源项目。基于项目对象模型(POM),通过一小段描述信息管理项目构建。依赖管理:方便快捷地管理项目依赖的资源(jar包)。 项目构建:标准化的跨平台自动化项目构建方式。Maven面板中Lifecycle中的compile用于编译…