NBUT 1116 Flandre's Passageway (LIS变形)
题意:
给一个有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变形)相关推荐
- UVA 1471 Defense Lines (LIS变形)
题意:删除原序列中的一段连续子序列,使得剩下的序列中存在一段最长连续子序列. 题解:LIS变形 我们用l[i]l[i]l[i]和r[i]r[i]r[i]记录往右以iii结尾和往左以iii开头的最长连续 ...
- UVA 1471 Defense Lines 防线 (LIS变形)
给一个长度为n的序列,要求删除一个连续子序列,使剩下的序列有一个长度最大的连续递增子序列. 最简单的想法是枚举起点j和终点i,然后数一数,分别向前或向后能延伸的最长长度,记为g(i)和f(i).可以先 ...
- hdu 5256 LIS变形
给一个数列,问最少修改多少个元素使数列严格递增.如果不是要求"严格"递增,那就是求最长不降子序列LIS,然后n-LIS就是答案.要严格递增也好办,输入的时候用每个数减去其下标处理一 ...
- hdu 5087(LIS变形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5087 解题思路:这道题其实仔细想想很简单,次长LIS只有两种可能,一种就是等于LIS-1,一种就是LI ...
- 1715: 序列变换(LIS变形)
1715: 序列变换 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 我们有一个数列A1,A2-An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无 ...
- hdu 5256 序列变换 (LIS变形)
序列变换 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HLG 1334 最好的心情[lis 变形]
Description 俗话说"月有阴晴圆缺,人有悲欢离合.". 虽然大家都没这么悲催,但是心情的波动在所难免. MM的心情也会有波动,心情好心情值就高,心情不好心情值就低,每 ...
- UVa1471 Defense Lines(LIS变形)
题目链接 1.题目描述:给定一个长度为n的序列,现在可以删除一段任意长度的子序列,使得删除后剩下的序列中有长度最大的连续递增子序列 2.这个题目很新颖,刚开始看裸写了一个LIS,一看样例过了兴致勃勃的 ...
- NYOJ-79拦截导弹---LIS变形-最长递减子序列
最长递增子序列 (Longest increasing subsequence) 的变形,即最长递减子序列 已知求最长上升子序列的模板为: int res = 0; for(int i =0;i< ...
最新文章
- JavaScript Collection
- css怎么动画中该透明度,通过css3动画和opacity透明度实现呼吸灯效果
- 真正的AI内行盛会!3 天 3 位大神,29场专题论坛,200+位领域专家
- 【Servlet】response对象给用户返回数据
- 从缓存行出发理解volatile变量、伪共享False sharing、disruptor
- mysql update nowait_mysql innodb之select for update nowait
- Some Principles
- springmvc常用注解与类型转换
- centos命令行xkill
- struts 2.3.8备忘
- java 拦截器的作用?
- 批量自动下单(京东)
- 智慧工厂应用系统建设方案
- linux 如何看图软件,深度看图(linux看图软件) v1.2 官方最新版
- 解决:Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools“
- ORA-20011KUP-11024ORA-29913
- 移动地理信息系统学习笔记
- 台式计算机用u盘给电脑安装系统,台式机用u盘装系统,教您用u盘装系统给台式机...
- 出入库与库存系统的模型问题
- 英语preciouscorals贵珊瑚PreciousCorals红珊瑚
热门文章
- OpenGL 自制API gluPerspective
- [AaronYang]C#人爱学不学[6]
- jQuery再学习之二、jQuery选择器
- 黑加仑妞 使用vue+flask做全栈开发的全过程(实现前后端分离)
- java实现多线程抢单_来聊一聊3种实现JAVA多线程的方式吧
- L1-079 天梯赛的善良 (20 分)-PAT 团体程序设计天梯赛 GPLT
- [Java] 蓝桥杯ALGO-125 算法训练 王、后传说
- [Java] 蓝桥杯ALGO-85 算法训练 进制转换
- 蓝桥杯 ALGO-87 算法训练 字串统计
- Perl 字符串截取函数substr