首页 > 其他分享 >[dp] 飞翔

[dp] 飞翔

时间:2024-12-05 11:03:53浏览次数:8  
标签:map le int 飞翔 特殊 路段 dp

题目描述

鹰最骄傲的就是翱翔,但是鹰们互相都很嫉妒别的鹰比自己飞的快,更嫉妒其他的鹰比自己飞行的有技巧。于是,他们决定举办一场比赛,比赛的地方将在一个迷宫之中。

这些鹰的起始点被设在一个 n ∗ m n * m n∗m 矩阵的左下角 m a p 1 , 1 map_{1,1} map1,1​ 的左下角。终点被设定在矩阵的右上角 m a p n , m map_{n, m} mapn,m​ 的右上角,有些 m a p i , j map_{i, j} mapi,j​ 是可以从中间穿越的。每一个方格的边长都是 100 100 100 米。如图所示:

在这里插入图片描述
没有障碍,也没有死路。这样设计主要是为了高速飞行的鹰们不要发现死路来不及调整而发生意外。潘帕斯雄鹰冒着减RP的危险从比赛承办方戒备森严的基地中偷来了施工的地图。但是问题也随之而来,他必须在比赛开始之前把地图的每一条路都搞清楚,从中找到一条到达终点最近的路。(哈哈,笨鸟不先飞也要拿冠军)但是此鹰是前无古鹰,后无来鹰的吃菜长大的鹰–菜鸟。他自己没有办法得出最短的路径,于是紧急之下找到了学 O I OI OI 的你,希望找到你的帮助。

输入格式

首行为 n , m n, m n,m ,第 2 2 2 行为 k k k 表示有多少个特殊的边。以下 k k k 行为两个数, i , j i, j i,j 表示 m a p i , j map_{i,j} mapi,j​ 是可以直接穿越的。

输出格式

仅一行, ( 1 , 1 ) → ( n , m ) (1, 1) \to (n, m) (1,1)→(n,m) 的最短路径的长度,四舍五入保留到整数即可。

样例

样例输入1:

3 2
3
1 1
3 2
1 2

样例输出1:

383

数据范围

0 ≤ n , m ≤ 1 0 5 0 \le n, m \le 10^5 0≤n,m≤105
0 ≤ k ≤ 1000 0 \le k \le 1000 0≤k≤1000

题解

题目要求 ( 1 , 1 ) → ( n , m ) (1,1) \to (n, m) (1,1)→(n,m) 的最短路径。

考虑这种问题是否能向回走(即向左和向下更优)。
如果在 ( i , j ) (i, j) (i,j) 向左或向下走,则必有两条无用的线段(走出去和返回)。
即使两条中有用到特殊路段,将去和返回的两条线段拼在一起,两边之和大于第三边(可以直接到达的线段)。
因此只能向上和向右走。

考虑使用 d p dp dp 或记忆化搜索进行处理:

很容易想到一个暴力的方法:
当前状态为 ( i , j ) (i, j) (i,j),可以从 ( i − 1 , j ) (i - 1, j) (i−1,j) 和 ( i , j − 1 ) (i, j - 1) (i,j−1) 走过来。如果是特殊路段,还可以从 ( i − 1 , j − 1 ) (i - 1, j - 1) (i−1,j−1) 走过来。
时间复杂度为 O ( n × m ) O(n \times m) O(n×m)。

注意到 n × m n \times m n×m 很大,但 k k k 很小。
如果没有特殊路段, ( 1 , 1 ) → ( n , m ) (1, 1) \to (n, m) (1,1)→(n,m) 的最短路径长度一定是 n + m n + m n+m。
由于特殊路段比两条路加起来短,所以只需求替换满足条件的最多个数的特殊路段。

如果要走到 ( i , j ) (i, j) (i,j),则之前走过的 ( x , y ) (x, y) (x,y) 一定满足 x ≤ i x \le i x≤i 和 y ≤ j y \le j y≤j。
也就是说,如果要走特殊路段 ( p , q ) (p, q) (p,q),上一个选的特殊路段 ( x , y ) (x, y) (x,y) 一定满足 x < p x < p x<p 和 y < q y < q y<q。
即对特殊路段求最长上升子序列。

先按照 x x x 坐标进行排序,在对 y y y 求最长上升子序列(注意要判断 x x x 的大小),就求出了替换个数 s s s。
答案就为 n + m − s × ( 2 − 2 ) n + m - s \times (2 - \sqrt2) n+m−s×(2−2 ​),四舍五入即可。

sort(a + 1, a + k + 1, cmp);//x 从小到大
//最长上升子序列
for(int i = 1; i <= k; ++ i){
	f[i] = 1;
	for(int j = 1; j < i; ++ j){
		if(a[i].y > a[j].y && a[i].x > a[j].x){
			f[i] = max(f[j] + 1, f[i]);
		}
	}
}
int ans = 0;
for(int i = 1; i <= k; ++ i){
	ans = max(ans, f[i]);
}

标签:map,le,int,飞翔,特殊,路段,dp
From: https://blog.csdn.net/m0_64542522/article/details/144256862

相关文章

  • 初识UDP(编写一个回显服务器)
    目录初识UDP(编写一个回显服务器)UDPsocketAPI的使用实现一个回显服务器服务器代码客户端代码实现效果代码解释流程解释初识UDP(编写一个回显服务器)UDP是传输层的协议操作系统提供了UDPAPI(操作系统提供给我们进行网络编程的API叫做“socketAPI”---->“网络......
  • [Linux网络]TCP和UDP协议的底层理论
    目录一、TCP和UDP协议的简单认识1.传输层协议2.五元组二、UDP协议1.UDP协议格式2.UDP协议的特点3.面向数据报4.UDP传输报文在内核中的管理5.基于UDP协议的应用层协议(部分)三、TCP协议1.发送和接收数据示意图2.TCP协议格式3.确认应答机制和超时重传机制4.发......
  • 决策单调性优化dp学习笔记
    点的第一个省选级算法,算是一个很好的过渡。决策单调性,也称四边形不等式优化dp。主要适用于转移式子大概长这样的时候:\(f_i=\min/\max\{f_j+w(j,i)\}\),其中\(w(j,i)\)满足四边形不等式。四边形不等式当\(a\leb\lec\led\)时,若存在$w(a,c)+w(b,d)\lew(a,d)+w(b,c)......
  • ui设计中px、pt、ppi、dpi、dp、sp之间的关系?
    Let'sbreakdowntherelationshipsbetweentheseunitsinUIdesign,specificallyforfront-enddevelopment:Pixels(px):Definition:Apixelisthesmallestaddressableelementonadisplay.It'saphysicalunit,representingasinglepoint......
  • 【恐怖の算法】 背包DP
    【恐怖の算法】背包DP引入在具体讲何为「背包dp」前,先来看如下的例题:题目传送门:洛谷P2871[USACO07DEC]CharmBraceletS在上述例题中,由于每个物体只有两种可能的状态(取与不取),对应二进制中的\(0\)和\(1\),这类问题便被称为「\(0-1\)背包问题」。\(0-1\)背包解释例题......
  • 【解决方法】vscode import cv2报错Import "cv2" could not be resolvedPylancereport
    报错一般是opencv-python装的环境与当前环境不是同一个1.没有装opencv-pythonpipinstallopencv-python -ihttps://pypi.tuna.tsinghua.edu.cn/simple2.装错了在左侧扩展栏目中搜索@workspaceUnsupported下拉点击表示 在右侧加入信任文件ctrl+shift+p在下来菜单中......
  • E86 换根DP CF1324F Maximum White Subtree
    视频链接:E86换根DPCF1324FMaximumWhiteSubtree_哔哩哔哩_bilibili  MaximumWhiteSubtree-洛谷|计算机科学教育新生态//换根DPO(n)#include<bits/stdc++.h>usingnamespacestd;constintN=200005;vector<int>e[N];intn,a[N],f[N];voiddfs(int......
  • TCP/IP 和 UDP
    一、TCP/IP(传输控制协议)TCP/IP是一个协议族,它是互联网的基础协议,为网络通信提供了标准化的方法。TCP/IP分为四个层次,每一层都有特定的功能:应用层:这是最接近用户的层,包含了所有高级协议,如HTTP(网页浏览)、FTP(文件传输)、SMTP(邮件传输)等。应用层负责应用程序之间的交互,确保数......
  • 洛谷 P1537 弹珠(DP)
    题目传送门https://www.luogu.com.cn/problem/P1537解题思路这是一道DP题……设  表示前  种弹珠,两人差距为  是否可行。那对于价值为  的弹珠,我们可以枚举一个  表示前者选  个这种弹珠,那么后者就会选  个弹珠(其中 表示价值为 的弹珠的数量)。易得转......
  • 树形dp格式
    潜入行动为例,主要是dfs部分的代码,每次合成两个树,然后再把新的树往上面和,转移会非常容易#include<bits/stdc++.h>usingnamespacestd;#defineLLlonglongconstintN=1e5+10,mod=1e9+7;intf[N][105][2][2],n,k,siz[N],g[105][2][2];vector<int>E[N];int......