题目:

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

这些鹰的起始点被设在一个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行为k0<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的更多相关文章

  1. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  2. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  3. 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门 ...

  4. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  5. POJ 2479-Maximum sum(线性dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33918   Accepted: 10504 Des ...

  6. poj 1050 To the Max(线性dp)

    题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...

  7. nyoj44 子串和 线性DP

    线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...

  8. 『最大M子段和 线性DP』

    最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...

  9. 『最长等差数列 线性DP』

    最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...

随机推荐

  1. 突然虚拟机无法联网解决办法,且报错Failed to start LSB: Bring up/down

    使用sudo service network restart去启动网络时起不来 使用systemctl status network.service查看网络状态也是failed,且报错Failed t ...

  2. python爬虫学习过程记录

    项目为爬取Python词条的信息. 项目代码在我的码云仓库. https://gitee.com/libo-sober/learn-python/tree/master/baike_spider 1. ...

  3. RabbitMQ消息积压的几种解决思路

    在日常工作中使用RabbitMQ偶尔会遇不可预料的情况导致的消息积压,一般出现消息积压基本上分为几种情况: 消费者消费消息的速度赶不上生产速度,这总问题主要是业务逻辑没设计好消费者和生产者之间的平衡, ...

  4. Java读取excel 支持xls 和 xlsx格式

    1.工具类public class InExcelTool { //根据指定位置单独读取一个 public static String getContent(String file, int page ...

  5. JVM直接内存(Direct Memory)

    直接内存 1.直接内存不是虚拟机运行时数据区的一部分,也不是<Java虚拟机规范>中定义的内存区域. 2.直接内存是Java堆外的.直接向系统申请的内存区间. 3.简单理解: java p ...

  6. openstack核心组件——neutron网络服务(8)

    云计算openstack核心组件——neutron网络服务(8)   一.neutron 介绍:   Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云 ...

  7. 重磅来袭 Vue 3.0 One Piece 正式发布

    代号为One Piece 的Vue3.0 在9月19日凌晨正式发布!! 此次vue3.0 为用户提供了全新的 composition-api 以及更小的包大小,和更好的 TypeScript 支持. ...

  8. 八皇后问题(n-皇后问题)

    JAVA 作为一道经典的题目,那必然要用经典的dfs来做 dfs:深度优先搜索----纵向搜索符合条件的内容,走到底时回到上一个路口再走到底再回去,套娃至结束. 条件:在一个n*n的国际棋盘上摆放n个 ...

  9. pwnable.kr-mistake-witeup

    阅读代码后思路: 实践: 1111111111 其异或值:0000000000 欧克,愉快的结束. 需要经常多看代码,对代码的书写习惯有了解,比如这一块17行一般人书写时都会习惯性加括号的.

  10. Kubernetes客户端和管理界面大集合

    今天给大家介绍目前市面上常用的kubernetes管理工具,总有一款适合您~~~ 简介 Kubectl K9s Kubernetes-Dashboard Rancher Kuboard Lens Oc ...