题意:

  给一个有n*m格子的矩形,设每格边长100,要从(1,1)走到(n,m)需要耗(n+m)*100,但是其中有一些格子是可以直接穿过的,也就是走对角线,是100*根号2长,给出k个可以穿过的格子,要求最短路径是多少?

思路:

  研究一下知道当选择了某个可穿过的格子(x,y),那么对于任意格子(>x,y)和(x,>y)都是不能再选的,因为这样会更长,也就是说同一行最多只能选一个格子穿过。一开始想到的是在一个拓扑序列中求最小路径的权之和,这个模型倒是没错,但是怎么建立一个这样的图就麻烦了。再想到用DP来穷举每个格子,复杂度O(N*M),上限有100亿,会超时,而且当k=1,n=m=100000时,复杂度还要n*m。看到别人提出LIS最长递增子序列。先按x坐标排个序,对于每个可穿的格子,判断若要穿过此格子,其前面还能穿过几个。按照O(N^2)的方法做的,代码较短。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=2010;
 4 int n, m, k, dp[N];
 5 struct node
 6 {
 7     int x,y;
 8 }a[N];
 9 int cmp(node a, node b)
10 {
11     return a.x < b.x ? 1 :0;
12 }
13 bool cpr(node *a, node *b)//这里与LIS不同在:这是二维的
14 {
15     if(a->x < b->x && a->y < b->y )
16         return true;
17     else
18         return false;
19 }
20 int cal()
21 {
22     memset(dp,0,sizeof(dp));
23     int big=0;
24     for(int i=1; i<=k; i++)
25     {
26         int j=i, tmp=0;
27         while(--j)
28             if( dp[j]>tmp && cpr(&a[j],&a[i]))    tmp=dp[j];
29         dp[i]=tmp+1;
30         if(dp[i]>big)   big=dp[i];
31     }
32     return big;
33 }
34 int main()
35 {
36     //freopen("e://input.txt","r",stdin);
37     while(cin>>n>>m)
38     {
39         cin>>k;
40         a[0].x=a[0].y=-1;
41         for(int i=1; i<=k; i++)
42             scanf("%d%d",&a[i].x,&a[i].y);  //x是n那边的
43         sort(a+1,a+k+1,cmp);
44         int cnt=cal();
45         double ans=(n+m-2*cnt)*100+sqrt(2.0)*100*cnt;
46         printf("%d\n",(int)(ans+0.5));
47     }
48     return 0;
49 }

AC代码

转载于:https://www.cnblogs.com/xcw0754/p/4538315.html

NBUT 1116 Flandre's Passageway (LIS变形)相关推荐

  1. UVA 1471 Defense Lines (LIS变形)

    题意:删除原序列中的一段连续子序列,使得剩下的序列中存在一段最长连续子序列. 题解:LIS变形 我们用l[i]l[i]l[i]和r[i]r[i]r[i]记录往右以iii结尾和往左以iii开头的最长连续 ...

  2. UVA 1471 Defense Lines 防线 (LIS变形)

    给一个长度为n的序列,要求删除一个连续子序列,使剩下的序列有一个长度最大的连续递增子序列. 最简单的想法是枚举起点j和终点i,然后数一数,分别向前或向后能延伸的最长长度,记为g(i)和f(i).可以先 ...

  3. hdu 5256 LIS变形

    给一个数列,问最少修改多少个元素使数列严格递增.如果不是要求"严格"递增,那就是求最长不降子序列LIS,然后n-LIS就是答案.要严格递增也好办,输入的时候用每个数减去其下标处理一 ...

  4. hdu 5087(LIS变形)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5087 解题思路:这道题其实仔细想想很简单,次长LIS只有两种可能,一种就是等于LIS-1,一种就是LI ...

  5. 1715: 序列变换(LIS变形)

    1715: 序列变换 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 我们有一个数列A1,A2-An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无 ...

  6. hdu 5256 序列变换 (LIS变形)

    序列变换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. HLG 1334 最好的心情[lis 变形]

    Description 俗话说"月有阴晴圆缺,人有悲欢离合.". 虽然大家都没这么悲催,但是心情的波动在所难免.   MM的心情也会有波动,心情好心情值就高,心情不好心情值就低,每 ...

  8. UVa1471 Defense Lines(LIS变形)

    题目链接 1.题目描述:给定一个长度为n的序列,现在可以删除一段任意长度的子序列,使得删除后剩下的序列中有长度最大的连续递增子序列 2.这个题目很新颖,刚开始看裸写了一个LIS,一看样例过了兴致勃勃的 ...

  9. NYOJ-79拦截导弹---LIS变形-最长递减子序列

    最长递增子序列 (Longest increasing subsequence) 的变形,即最长递减子序列 已知求最长上升子序列的模板为: int res = 0; for(int i =0;i< ...

最新文章

  1. JavaScript Collection
  2. css怎么动画中该透明度,通过css3动画和opacity透明度实现呼吸灯效果
  3. 真正的AI内行盛会!3 天 3 位大神,29场专题论坛,200+位领域专家
  4. 【Servlet】response对象给用户返回数据
  5. 从缓存行出发理解volatile变量、伪共享False sharing、disruptor
  6. mysql update nowait_mysql innodb之select for update nowait
  7. Some Principles
  8. springmvc常用注解与类型转换
  9. centos命令行xkill
  10. struts 2.3.8备忘
  11. java 拦截器的作用?
  12. 批量自动下单(京东)
  13. 智慧工厂应用系统建设方案
  14. linux 如何看图软件,深度看图(linux看图软件) v1.2 官方最新版
  15. 解决:Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools“
  16. ORA-20011KUP-11024ORA-29913
  17. 移动地理信息系统学习笔记
  18. 台式计算机用u盘给电脑安装系统,台式机用u盘装系统,教您用u盘装系统给台式机...
  19. 出入库与库存系统的模型问题
  20. 英语preciouscorals贵珊瑚PreciousCorals红珊瑚

热门文章

  1. OpenGL 自制API gluPerspective
  2. [AaronYang]C#人爱学不学[6]
  3. jQuery再学习之二、jQuery选择器
  4. 黑加仑妞 使用vue+flask做全栈开发的全过程(实现前后端分离)
  5. java实现多线程抢单_来聊一聊3种实现JAVA多线程的方式吧
  6. L1-079 天梯赛的善良 (20 分)-PAT 团体程序设计天梯赛 GPLT
  7. [Java] 蓝桥杯ALGO-125 算法训练 王、后传说
  8. [Java] 蓝桥杯ALGO-85 算法训练 进制转换
  9. 蓝桥杯 ALGO-87 算法训练 字串统计
  10. Perl 字符串截取函数substr