P3842 [TJOI2007] 线段

[TJOI2007] 线段

题目描述

在一个 n × n n \times n n×n 的平面上,在每一行中有一条线段,第 i i i 行的线段的左端点是 ( i , L i ) (i, L_{i}) (i,Li),右端点是 ( i , R i ) (i, R_{i}) (i,Ri)

你从 ( 1 , 1 ) (1,1) (1,1) 点出发,要求沿途走过所有的线段,最终到达 ( n , n ) (n,n) (n,n) 点,且所走的路程长度要尽量短。

更具体一些说,你在任何时候只能选择向下走一步(行数增加 1 1 1)、向左走一步(列数减少 1 1 1)或是向右走一步(列数增加 1 1 1)。当然,由于你不能向上行走,因此在从任何一行向下走到另一行的时候,你必须保证已经走完本行的那条线段。

输入格式

第一行有一个整数 n n n

以下 n n n 行,在第 i i i 行(总第 ( i + 1 ) (i+1) (i+1) 行)的两个整数表示 L i L_i Li R i R_i Ri

输出格式

仅包含一个整数,你选择的最短路程的长度。

样例 #1

样例输入 #1

6
2 6
3 4
1 3
1 2
3 6
4 5

样例输出 #1

24

提示

我们选择的路线是

 (1, 1) (1, 6)(2, 6) (2, 3)(3, 3) (3, 1)(4, 1) (4, 2)(5, 2) (5, 6)(6, 6) (6, 4) (6, 6)

不难计算得到,路程的总长度是 24 24 24

对于 100 % 100\% 100% 的数据中, n ≤ 2 × 1 0 4 n \le 2 \times 10^4 n2×104 1 ≤ L i ≤ R i ≤ n 1 \le L_i \le R_i \le n 1LiRin

正解

二维 dp。

一、状态: d p [ i ] [ 0 / 1 ] dp[i][0/1] dp[i][0/1] 表示从 ( 1 , 1 ) (1,1) (1,1) 走到第 i i i 条线段左端点或右端点的最短距离。

二、转移:分为四个部分。

  1. 右端点转右端点:也就是从 d p [ i − 1 ] [ 1 ] dp[i-1][1] dp[i1][1] 开始走,先走到现在的左端点,再走到现在的右端点,即 d p [ i − 1 ] [ 1 ] + a b s ( l [ i ] − r [ i − 1 ] ) + ( r [ i ] − l [ i ] + 1 ) dp[i-1][1]+abs(l[i]-r[i-1])+(r[i]-l[i]+1) dp[i1][1]+abs(l[i]r[i1])+(r[i]l[i]+1)
  2. 左端点转右端点:也就是从 d p [ i − 1 ] [ 1 ] dp[i-1][1] dp[i1][1] 开始走,先走到现在的左端点,再走到现在的右端点,即 d p [ i − 1 ] [ 0 ] + a b s ( l [ i ] − l [ i − 1 ] ) + ( r [ i ] − l [ i ] + 1 ) dp[i-1][0]+abs(l[i]-l[i-1])+(r[i]-l[i]+1) dp[i1][0]+abs(l[i]l[i1])+(r[i]l[i]+1),这时 d p [ i ] [ 1 ] = m i n ( d p [ i − 1 ] [ 1 ] + a b s ( l [ i ] − r [ i − 1 ] ) + ( r [ i ] − l [ i ] + 1 ) , d p [ i − 1 ] [ 0 ] + a b s ( l [ i ] − l [ i − 1 ] ) + ( r [ i ] − l [ i ] + 1 ) ) dp[i][1]=min(dp[i-1][1]+abs(l[i]-r[i-1])+(r[i]-l[i]+1),dp[i-1][0]+abs(l[i]-l[i-1])+(r[i]-l[i]+1)) dp[i][1]=min(dp[i1][1]+abs(l[i]r[i1])+(r[i]l[i]+1),dp[i1][0]+abs(l[i]l[i1])+(r[i]l[i]+1))
  3. 右端点转左端点:也就是从 d p [ i − 1 ] [ 0 ] dp[i-1][0] dp[i1][0] 开始走,先走到现在的右端点,再走到现在的左端点,即 d p [ i − 1 ] [ 1 ] + a b s ( r [ i ] − r [ i − 1 ] ) + ( r [ i ] − l [ i ] + 1 ) dp[i-1][1]+abs(r[i]-r[i-1])+(r[i]-l[i]+1) dp[i1][1]+abs(r[i]r[i1])+(r[i]l[i]+1)
  4. 左端点转左端点:也就是从 d p [ i − 1 ] [ 0 ] dp[i-1][0] dp[i1][0] 开始走,先走到现在的右端点,再走到现在的左端点,即 d p [ i − 1 ] [ 0 ] + a b s ( r [ i ] − l [ i − 1 ] ) + ( r [ i ] − l [ i ] + 1 ) dp[i-1][0]+abs(r[i]-l[i-1])+(r[i]-l[i]+1) dp[i1][0]+abs(r[i]l[i1])+(r[i]l[i]+1),这时 d p [ i ] [ 0 ] = m i n ( d p [ i − 1 ] [ 1 ] + a b s ( r [ i ] − r [ i − 1 ] ) + ( r [ i ] − l [ i ] + 1 ) , d p [ i − 1 ] [ 0 ] + a b s ( r [ i ] − l [ i − 1 ] ) + ( r [ i ] − l [ i ] + 1 ) ) dp[i][0]=min(dp[i-1][1]+abs(r[i]-r[i-1])+(r[i]-l[i]+1),dp[i-1][0]+abs(r[i]-l[i-1])+(r[i]-l[i]+1)) dp[i][0]=min(dp[i1][1]+abs(r[i]r[i1])+(r[i]l[i]+1),dp[i1][0]+abs(r[i]l[i1])+(r[i]l[i]+1))

三、答案:最后的结果可能停在左端点或右端点,都要走到 ( n , n ) (n,n) (n,n),所以答案就是 min ⁡ ( d p [ n ] [ 1 ] + n − r [ n ] , d p [ n ] [ 0 ] + n − l [ n ] ) \min(dp[n][1]+n-r[n],dp[n][0]+n-l[n]) min(dp[n][1]+nr[n],dp[n][0]+nl[n])

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;const int N = 20010;
int n,l[N],r[N],dp[N][2]; void solve()
{cin >> n;for (int i = 1;i <= n;i++)cin >> l[i] >> r[i];dp[1][0] = (r[1]-1) + (r[1]-l[1]);dp[1][1] = r[1]-1;for (int i = 2;i <= n;i++){int rr = dp[i-1][1]+abs(l[i]-r[i-1])+(r[i]-l[i]+1);int lr = dp[i-1][0]+abs(l[i]-l[i-1])+(r[i]-l[i]+1);int rl = dp[i-1][1]+abs(r[i]-r[i-1])+(r[i]-l[i]+1);int ll = dp[i-1][0]+abs(r[i]-l[i-1])+(r[i]-l[i]+1);dp[i][1] = min(rr,lr);dp[i][0] = min(rl,ll);}cout << min(dp[n][1]+n-r[n],dp[n][0]+n-l[n]);
}signed main()
{solve();printf("\n");return 0;
}

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

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

相关文章

前端项目打包部署

打包 vue-cli脚手架的前端项目&#xff0c;点击npm脚本中的第二条编译命令&#xff0c;即可将项目编译&#xff0c;生成一个dist的文件夹&#xff0c;里面存放的就是编译好的前端项目文件&#xff0c;没有脚手架就在终端敲击npm run build命令编译前端项目 部署 Nginx 介绍:…

IsotonicRegression、LinearRegression、RandomForestRegressor与FMRegressor

IsotonicRegression 核心原理&#xff1a; 保序回归&#xff08;Isotonic Regression&#xff09;是一种非参数回归方法&#xff0c;适用于处理有序数据。它试图在保持数据顺序的同时&#xff0c;拟合出一个单调非减或非增的函数。 数学表达式&#xff1a; 保序回归的目标是找…

Python使用总结之Python-docx操作Word文件(添加、编辑和删除文档内容,在文档中插入图片)

Python使用总结之Python-docx操作Word文件(添加、编辑和删除文档内容&#xff0c;在文档中插入图片) python-docx 是一个用于创建和修改 Microsoft Word (.docx) 文件的Python库。本文将详细介绍如何使用 python-docx 创建、编辑、删除Word文件&#xff0c;以及如何添加、编辑和…

linux配置用户

一&#xff0c;安装sudo与确保在管理员用户下 apt update apt install sudo -y 切换用户&#xff1a;密码不会显示&#xff0c;一个个输入然后回车。//图中是zfxt-->Stable用户切换 su root //root为用户名 以其他用户执行命令&#xff1a; su root ping baidu.com //su…

如何在pandas创建一个seris结构?

创建一个Series结构在pandas库中是非常简单的。Series是一个一维的、大小可变的、可以存储任何数据类型的数组&#xff0c;并且有一个与之关联的标签序列&#xff08;索引&#xff09;。 以下是如何创建一个Series的基本步骤&#xff1a; 导入pandas库&#xff1a; 首先&#…

人工智能--制造业和农业

欢迎来到 Papicatch的博客 文章目录 &#x1f349;人工智能在制造业中的应用 &#x1f348; 应用场景及便利 &#x1f34d;生产线自动化 &#x1f34d;质量控制 &#x1f34d;预测性维护 &#x1f34d;供应链优化 &#x1f348; 技术实现及核心 &#x1f34d;机器学习和…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】感知器

感知器是一种非常早期的线性分类模型&#xff0c;作为一种简单的神经网络模型被提出。感知器是一种模拟生物神经元行为的机器&#xff0c;有与生物神经元相对应的部件&#xff0c;如权重&#xff08;突触&#xff09;、偏置&#xff08;阈值&#xff09;及激活函数&#xff08;…

Vue3.0:前端开发的新纪元,核心特性全览

随着 Vue 3.0 的发布&#xff0c;它带来了许多令人兴奋的新特性&#xff0c;这些特性不仅提升了框架的性能&#xff0c;还简化了开发流程。在这篇文章中&#xff0c;我们将一起探讨 Vue 3.0 的一些关键新特性&#xff0c;并通过一些直观小例子来说明它们是如何工作的。 1. 响应…

C# —— 异常捕获

通过对异常进行补捕获 可以避免掉代码运行错误时 程序直接卡死 基本语法 try &#xff1a; 试 try { // 希望进行异常捕获的代码 // 放到try中 // 如果try中的代码报错 程序也不会卡死 } catch : 捕获 catch { // try中代码出错 会执行 catch中的代码块 来捕…

CobaltStrike权限传递MSF

一、测试环境 操作系统&#xff1a; 1.VMware17 2.kali 6.1.0-kali5-amd64 3.Win10x64 软件&#xff1a; 1.cs4.0 2.metasploit v6.3.4-dev 二、测试思路 1.cs是一款渗透测试工具&#xff0c;但没有漏洞利用的模块&#xff0c;我们可以在拿到目标主机的权限后&#xff0c;将…

高速直线导轨驱动与控制,精准稳定的运动核心元件

直线导轨在工业生产中&#xff0c;精度和稳定性是至关重要的。而在各种机械设备中&#xff0c;高精度直线导轨是提高设备运动控制精度和平稳性的核心部件&#xff0c;当我们考虑高速运动时&#xff0c;直线导轨的精度和稳定性是非常重要的因素。 直线导轨系统中如何确保高速运动…

DeepSeek-V2-Chat多卡推理(不考虑性能)

TOC 本文演示了如何使用accelerate推理DeepSeek-V2-Chat(裁剪以后的模型,仅演示如何将权值拆到多卡) 代码 import torch from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig from accelerate import init_empty_weights import sys from acce…

Mysql的null值处理

开源项目SDK&#xff1a;https://github.com/mingyang66/spring-parent 个人文档&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ 在Mysql中&#xff0c;null用于标识缺失的或未知的数据&#xff0c;处理null值需要特别小心&#xff0c;因为在数据库中塔可能会导致不…

怎么更快捷的修改图片大小?压缩图片jpg、png、gif的快捷方法

jpg作为最常用的一种图片格式&#xff0c;在遇到图片太大问题时&#xff0c;该如何操作能够快速在压缩图片jpg的大小呢&#xff1f;图片太大无法上传时目前常见的一个使用问题&#xff0c;只有将图片处理到合适的大小才可以正常在平台上传使用&#xff0c;一般情况下想要快速解…

LLM大模型开发的一般流程

何谓大模型开发&#xff1f; 将开发以大语言模型为功能核心、通过大语言模型的强大理解能力和生成能力、结合特殊的数据或业务逻辑来提供独特功能的应用称为大模型开发。 主要功能点&#xff1a; 调用工具prompt engineering数据工程业务逻辑拆分 一般开发流程&#xff1a;…

API安全性的重要性及实施策略

在当今日益互联的世界中&#xff0c;API&#xff08;应用程序编程接口&#xff09;成为连接不同软件系统的关键桥梁。随着API的使用越来越广泛&#xff0c;其安全性问题也日益凸显。一个不安全的API可能会使企业数据和用户信息面临严重的风险。因此&#xff0c;确保API的安全性…

Perl语言入门学习

引言 Perl是一种功能强大的编程语言&#xff0c;广泛用于文本处理、系统管理和Web开发。它以其灵活性和强大的正则表达式处理能力著称。本篇博客将介绍Perl的基础知识&#xff0c;并通过多个例子帮助初学者快速上手。 1. 安装Perl 在开始学习Perl之前&#xff0c;您需要确保…

Stable diffusion 3 正式开源

6月12日晚&#xff0c;著名开源大模型平台Stability AI正式开源了&#xff0c;文生图片模型Stable Diffusion 3 Medium&#xff08;以下简称“SD3-M”&#xff09;权重。 SD3-M有20亿参数&#xff0c;平均生成图片时间在2—10秒左右推理效率非常高&#xff0c;同时对硬件的需求…

贪心+构造,CF1153 C. Serval and Parenthesis Sequence

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1153C - Codeforces 二、解题报告 1、思路分析 对于括号匹配问题我们经典做法是左括号当成1&#xff0c;右括号当成-1 那么只要任意前缀非负且最终总和为0那么该括号序列就是合法 对于本题&…

计算机网络 —— 运输层(TCP三次握手)

计算机网络 —— 运输层&#xff08;TCP三次握手&#xff09; 三次握手第一次握手第二次握手第三次握手两次握手行不行&#xff1f; 我们今天来学习TCP的三次握手&#xff1a; 三次握手 TCP三次握手是TCP协议中建立连接的过程&#xff0c;旨在确保双方准备好进行可靠的通信。…