博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P2254 [NOI2005]瑰丽华尔兹(单调队列)
阅读量:6757 次
发布时间:2019-06-26

本文共 1283 字,大约阅读时间需要 4 分钟。

 

大概就是设$dp[i][x][y]$表示在第$i$个时间段,在$(x,y)$时的最大滑动距离

然后转移是$dp[i][x][y]=max(dp[i-1][x][y],dp[i][x'][y']+dis(x,y,x',y'))$

然后用单调队列进行优化,遇到障碍清除整个单调队列

1 //minamoto 2 #include
3 #include
4 const int N=205; 5 template
inline bool cmax(T&a,const T&b){
return a
=1&&x<=n&&y>=1&&y<=m;++i,x+=dx[d],y+=dy[d])16 if(mp[x][y]=='x') h=1,t=0;17 else{18 while(h<=t&&q[t].dp+i-q[t].pos
len) ++h;21 dp[x][y]=q[h].dp+i-q[h].pos;22 cmax(ans,dp[x][y]);23 }24 }25 int main(){26 // freopen("testdata.in","r",stdin);27 scanf("%d%d%d%d%d",&n,&m,&sx,&sy,&k);28 for(int i=1;i<=n;++i) scanf("%s",mp[i]+1);29 memset(dp,0xef,sizeof(dp));30 dp[sx][sy]=0;31 while(k--){32 int s,t,d;scanf("%d%d%d",&s,&t,&d);33 int len=t-s+1;34 switch(d){35 case 1:for(int i=1;i<=m;++i) solve(n,i,len,d);break;36 case 2:for(int i=1;i<=m;++i) solve(1,i,len,d);break;37 case 3:for(int i=1;i<=n;++i) solve(i,m,len,d);break;38 case 4:for(int i=1;i<=n;++i) solve(i,1,len,d);break;39 }40 }41 printf("%d\n",ans);42 return 0;43 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9799922.html

你可能感兴趣的文章
设计模式简介和分类,重点在总结
查看>>
数据库默认端口
查看>>
从输入网址到显示网页的全过程分析【转】
查看>>
【 Art 】小心心~
查看>>
机器学习的常见面试问题
查看>>
创建 JavaScript 类和对象 prototype
查看>>
ibatis映射及参数设置
查看>>
Python学习笔记【第三篇】:if判断、while循环、for循环
查看>>
运用正则表达式不使用内置方法实现计算器
查看>>
Mac OS 设置$PATH环境变量
查看>>
闭区间合并
查看>>
兄弟郊游问题
查看>>
Jquery页面中添加键盘按键事件,如ESC事件
查看>>
Msm 高通平台配置记录之一
查看>>
列表的基本操作
查看>>
HDU1856:More is better(并查集)
查看>>
大端模式和小端模式
查看>>
农民工与学生为楼癫狂 富人加速撤离
查看>>
java中的包装类
查看>>
android,性能优化,内存优化管理,高级缓存 (转)
查看>>