飞翔---------双重线性dp
题目:
鹰最骄傲的就是翱翔,但是鹰们互相都很嫉妒别的鹰比自己飞的快,更嫉妒其他的鹰比自己飞行的有技巧。于是,他们决定举办一场比赛,比赛的地方将在一个迷宫之中。
这些鹰的起始点被设在一个N*M
矩阵的左下角map[1,1]
的左下角。终点被设定在矩阵的右上角map[N,M]
的右上角,有些map[i,j]
是可以从中间穿越的。每一个方格的边长都是100
米。如图所示:
没有障碍,也没有死路。这样设计主要是为了高速飞行的鹰们不要发现死路来不及调整而发生意外。
潘帕斯雄鹰冒着减RP
的危险从比赛承办方戒备森严的基地中偷 来了施工的地图。但是问题也随之而来,他必须在比赛开始之前把地图的每一条路都搞清楚,从中找到一条到达终点最近的路。(哈哈,笨鸟不先飞也要拿冠军)但 是此鹰是前无古鹰,后无来鹰的吃菜长大的鹰--菜鸟。他自己没有办法得出最短的路径,于是紧急之下找到了学OI
的你,希望找到你的帮助
刚看到题目好像一脸懵逼,map[ i ][ j ]不应该是一个坐标吗????怎么还可以从中穿过??????
经过半个小时的认真读题后,终于明白了题目的意思,大概如下:
现有N×M个方格子,方格的四周的边是路,鹰只能在路上飞,有一些格子上面有一条斜路,也可以走。
输入:
首行为n,m(0<n,m<=1000000)
,第2
行为k
(0<k<=1000
)表示有多少个特殊的边。以下k
行为两个数,i,j
表示map[i,j]
是可以直接穿越的。
输出:
仅一行,(1,1)-->(n,m)
的最短路径的长度,四舍五入保留到整数即可。
思路:
这道题的主要思路有两点,一是求最多特殊路,二是通过特殊路的数量直接求结果。
1.特殊路数量:首先明白一点,要想结果更优,那肯定在去终点m,n的路上走了若干特殊路,在不往回绕的前提下走的特殊路越多,结果越优。
2.推结果:每一跳特殊路相当于代替了两个标准路,所以最后的ans应该=(m+n-2*tot)+tot*sqrt(2)*100;
(如果一条特殊路都不走,最优路径就是m+n,每走一条,就会少走2条100的路,多走一条100×根号2的路)
好了那么最后问题变成如何求最多的特殊路径了,
显然(好吧,其实我也不知道怎么证),如果一条路径的 i , j 都大于另一条的 i , j 那么这条路经一定可以接在另一条后面,即选了i,j较小的,那么在这种解中,一定可以选> i , > j的一条路径,就类似于一个对角线,直上直下方格中的路径不能同时选,斜对角的可以。
那么,由于题目中路径都是随机给的,我们需要让它变得相对有序,即进行一次排序:
for(int i=1;i<=k;i++){
LL x,y;
scanf("%lld%lld",&x,&y);
a[++cnt].x=x;
a[cnt].y=y;
}
sort(a+1,a+cnt+1,cmp); bool cmp(FJ a,FJ b){
if(a.x==b.x)return a.y<b.y;
else return a.x<b.x;
}
尽量使坐标们都成升序排列,然后找双重lis,即a[ i ] . x > a[ j ] . x && a[ i ] . y>a[ j ] . y时才可以转移。
dp代码:
LL tot=0,xx=0,yy=0;
for(int i=1;i<=k;i++){
c[i]=1;
for(int j=1;j<i;j++)
if(a[i].x>a[j].x&&a[i].y>a[j].y&&c[i]<c[j]+1){
c[i]=c[j]+1;
tot=max(c[i],tot);
}
}
这样就可以求出最大可以走几条特殊路径了,结果也就呼之欲出了。
代码全貌:
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 #include<algorithm>
5 #include<cmath>
6 using namespace std;
7 typedef long long LL;
8 const int maxn=1000000+10;
9 struct FJ{LL x,y;}a[maxn];
10 LL Max,c[maxn];
11 bool cmp(FJ a,FJ b){
12 if(a.x==b.x)return a.y<b.y;
13 else return a.x<b.x;
14 }
15 int main(){
16 LL n,m;
17 scanf("%lld%lld",&n,&m);
18 LL k;
19 scanf("%lld",&k);
20 int cnt=0;
21 for(int i=1;i<=k;i++){
22 LL x,y;
23 scanf("%lld%lld",&x,&y);
24 a[++cnt].x=x;
25 a[cnt].y=y;
26 }
27 sort(a+1,a+cnt+1,cmp);
28 LL tot=0,xx=0,yy=0;
29 for(int i=1;i<=k;i++){
30 c[i]=1;
31 for(int j=1;j<i;j++)
32 if(a[i].x>a[j].x&&a[i].y>a[j].y&&c[i]<c[j]+1){
33 c[i]=c[j]+1;
34 tot=max(c[i],tot);
35 }
36 }
37 double ans=100*(m+n-2*tot)+100*sqrt(2)*tot;
38 printf("%.0lf",ans);
39 return 0;
40 }
飞翔---------双重线性dp的更多相关文章
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- hdu1712 线性dp
//Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- nyoj44 子串和 线性DP
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...
- 『最大M子段和 线性DP』
最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...
- 『最长等差数列 线性DP』
最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...
随机推荐
- 关于非标准json格式转变为json对象
eval('(' + tempData + ')') 只需要这一句
- HTML -- 表单元素2
(1)<select>元素(下拉列表) <html> <body> <!-- 表单处理程序在action属性中指定 --> <form actio ...
- windows下nginx的配置
这里做的nginx的配置主要的功能是: 能够用localhost访问本地文件夹中的项目 输入ip地址访问本地文件夹中的项目 反向代理其他地址访问本地文件 1.nginx安装地址 2.解压之后的文件如下 ...
- 口罩预约管理系统——数据库设计(前端+PHP+MySQL)
目录 一.背景 二.口罩预约管理系统介绍 三.数据库设计 四.MySQL创建数据库以及数据表 五.数据库设计总结 一.背景 2020年的疫情影响了我们的生产生活,政府不断加大力度联防联控,遏制疫情的蔓 ...
- 关于java基础_数组的学习
数组的学习 1.数组的概念?作用是什么? 系统中存储多个值, 2.数组的定义? 数据类型[] 数组名; 3.定义好数组以后需要对其进行初始化 数组初始化有两种: 第一种动态初始化,指定数组的长度,长度 ...
- nginx upstream一致性哈希的实现
地址:http://wiki.nginx.org/HttpUpstreamConsistentHash 首先声明一个命令: static ngx_command_t ngx_http_upstrea ...
- spring mvc(4) HandlerMapping
在前面一节里提到,DispatcherServlet在接收到请求后,通过HandlerMapping找到处理请求对应的Controller(其实处理请求器并不一定是Controller,还可以是Htt ...
- python安装scrapy库失败
解决方法: 首先,下载Twisted.cp后数字为python版本,例如cp36为python3.6:amd则表示系统位数,例如amd64为64位.下载对应版本即可.点击打开链接 找到Twisted, ...
- 【答疑解惑】为什么你的 Charles 会抓包失败?
作为一名 Web 开发工程师,天天都会和网络打交道.Charles 作为一款网络抓包工具,几乎成了 Web 开发的标配. 本文是我深度使用 Charles 后总结而成,不同于其它介绍 Charles ...
- Redis中的订阅模式
redis中的客户端可以订阅一个自定义的频道,接受来自该频道的消息 订阅 订阅指定频道-SUBSCRIBE SUBSCRIBE channel [channel2]... SUBSCRIBE 频道名 ...