题目:

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

这些鹰的起始点被设在一个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. python基础 格式化输出

    格式化输出 '%s %d %.2f' % ('Novak', 33, 1.88) 需要逗号

  2. 容器服务 TKE 上服务暴露的几种方式

    预备知识 1. K8S 上 Service 类型 ClusterIP 通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType. NodePort ...

  3. 移动APP性能评测与优化

    本文是<移动App性能评测与优化>的读书笔记. PS:说是读书笔记,其实就是摘录. 移动App的性能测试主要包括:内存使用情况.电量消耗.功能的流畅度等: 1. 内存 1.1 内存的主要组 ...

  4. Vue等待父组件异步请求回数据'后'传值子组件

    问题: 让子组件在父组件有哪个数据的时候再渲染, 解决方案: 可以在父组件上加一个判断条件, 举例说明: <a-component :opt="opt" v-if=" ...

  5. docker zookeeper 集群搭建

    #创建集群目录 mkdir /opt/cluster/zk cd /opt/cluster/zk #清理脏数据[可跳过] docker stop zk-2181 docker stop zk-2182 ...

  6. 针对于Java的35 个代码性能优化总结

    针对于Java的35 个代码性能优化总结前言代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的 ...

  7. vulnhub靶机之Quaoar

    Quaoar 靶机非常简单. 扫描端口主机. wordpress建站. 扫到两个用户,分别是wpuser以及admin. 爆破出了后台: 传了一个一句话木马,连上蚁剑又传了个反弹shell. 反弹sh ...

  8. DC 1-3 靶机渗透

    DC-1靶机 端口加内网主机探测,发现192.168.114.146这台主机,并且开放了有22,80,111以及48683这几个端口. 发现是Drupal框架. 进行目录的扫描: 发现admin被禁止 ...

  9. MySql-8.0.x免安装版下载与配置,Navicat打开数据库链接报错1251的解决办法

    若你以前卸载过mysql,小白极大可能没有卸载和删除干净残留,没有卸载干净就肯定重装不成功,可参考https://www.cnblogs.com/Luoters/p/11869032.html 参考与 ...

  10. Java 实现常见内排序

    一.内排序 1.排序基本概念 (1)什么是排序? 排序指将一个数据元素集合或者序列 按照某种规则 重新排列成一个 有序的集合或者序列.分为内排序.外排序.排序算法的好坏直接影响程序的执行速度以及存储空 ...