飞翔---------双重线性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 等差子数列包括(仅包括两项的不 ...
随机推荐
- latex tips
latex tips latex 插入图片 主要是插入图片位置的问题,代码中的 bb= 决定了插入 fig2.eps 图片的某一方形区域,其中 表示该方形区域的左下角像素坐标是 0 0 ...
- vue项目前端导出word文件(bug解决)
摘要:之前项目中导出价格表是由后端实现,前端只需要调用接口下载word即可,后来业务改变比较大,word模版需要一直改动,后端改起来相对麻烦,后来直接前端自己定义模版,实现下载word文档. 一.需要 ...
- Centos 镜像文件下载
1. Centos 官网 https://www.centos.org 进入下载页面,选择下载的版本即可 不推荐在官网下载,因为官网上提供的下载地址很多是国外网站,下载太慢了 2. 阿里云Centos ...
- 从IL角度彻底理解回调_委托_指针
从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...
- JZOJ1496 页
Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场精彩的天马队列变换表演.首先,战神安排n头高度不同 ...
- JVM初认识
运行时数据区域 程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节 ...
- 基于MAXIMO的发电行业EAM解决方案
1. 行业背景 随着我国以“厂网分开,竞价上网”为特点的电力市场的起步和发展,发电厂.发电集团成为独立企业参与市场竞争,原有的“生产型”管理模式已经不再适应市场的需求.发电企业在重视安全质量.保证电力 ...
- hystrix源码之概述
概述 hystrix核心原理是通过代理执行用户命令,记录命令执行的metrics信息,通过这些metrics信息进行降级和熔断. 源码结构包括一下几个部分: 熔断器 熔断器就是hystrix用来判断调 ...
- Spring Cloud Alibaba生态探索:Dubbo、Nacos及Sentinel的完美结合
@ 目录 背景 一.项目框架 1.1 采用IDEA和Maven多模块进行项目搭建 1.2 模块管理及版本管理 二.微服务公共接口 2.1 定义一个公共接口Api 2.2 pom.xml 2.3 Goo ...
- TIDB 笔记
整体架构: