pro: 给出一个n*m的地图,刚开始人在(x,y),每次给出一段区间(l,r,t),表示在时间[l,r]内,可以使人向4个方向(t)移动一格,或者不动。求最大可以移动多少格。

sol: 考虑每一列(上下移)或者一行(左右移)的情况。以右移为例,我们可以很快列出dp方程:f[x][y][i]=max(f[x][y][i],f[x][j][i]+y-j)。这个dp方程我们可以用单调队列维护,所以复杂度就是nmk的。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=1e9+;
int dp[maxn][maxn][],ans;
char c[maxn][maxn];
int X[]={,-,,,},Y[]={,,,-,};
int q[maxn][],head,tail,N,M,now;
int update(int x,int y,int tp,int tk)
{
int res=dp[q[tp][]][q[tp][]][(tk^)&]+now-q[tp][];
dp[x][y][tk&]=max(dp[x][y][tk&],res);
return res;
}
int get(int tp,int tk)
{
int res=dp[q[tp][]][q[tp][]][(tk^)&]+now-q[tp][];
return res;
}
void work(int x,int y,int tK,int len,int opt)
{
head=,tail=; now=;
while(x>=&&x<=N&&y>=&&y<=M) {
dp[x][y][tK&]=dp[x][y][(tK^)&];
if(c[x][y]=='x') head=,tail=;
while(tail>=head&&now-q[head][]>len) head++;
while(tail>=head&&get(tail,tK)<dp[x][y][(tK^)&]) tail--;
if(tail>=head)
update(x,y,head,tK);
ans=max(ans,dp[x][y][tK&]);
tail++; q[tail][]=x; q[tail][]=y; q[tail][]=now++;
x+=X[opt]; y+=Y[opt];
}
}
int main()
{
int K,x,y,L,R,opt;
scanf("%d%d%d%d%d",&N,&M,&x,&y,&K);
rep(i,,N) scanf("%s",c[i]+);
rep(i,,N) rep(j,,M) rep(k,,K) dp[i][j][k]=-inf;
dp[x][y][]=;
rep(i,,K){
scanf("%d%d%d",&L,&R,&opt);
if(opt==) rep(j,,M) work(N,j,i,R-L+,opt);
if(opt==) rep(j,,M) work(,j,i,R-L+,opt);
if(opt==) rep(j,,N) work(j,M,i,R-L+,opt);
if(opt==) rep(j,,N) work(j,,i,R-L+,opt);
}
printf("%d\n",ans);
return ;
}

最新文章

  1. Android中使用Notification实现宽视图通知栏(Notification示例二)
  2. 修改NavigationView中的Item的Icon大小
  3. background-size对background-position的影响
  4. js词法作用域规则
  5. 关于struts2拦截器获取页面参数
  6. js运动 多物体运动含Json 但是里面数值不一样
  7. sping配置文件中引入properties文件方式
  8. highcharts js报表工具(报表插件)
  9. Java创建对象的几种方式
  10. win10 uwp 九幽图床
  11. You Only Look Once: Unified, Real-Time Object Detection(翻译)
  12. Android UiAutomator 快速调试
  13. js设计模式(四)---迭代器模式
  14. Python scrapy爬取带验证码的列表数据
  15. UVa - 10341
  16. Linux下库打桩机制分析 function Interposition
  17. css学习_文本有关的样式属性、sublime快捷生成标签
  18. 【虚拟机ubuntu设置ssh】ssh连不上问题解决方法
  19. 云-Azure-百科:Azure
  20. 对于redis框架的理解(二)

热门文章

  1. (转)Intellij Idea工具栏添加打开选中文件的资源管理器位置
  2. HMAC哈希消息认证码
  3. 图片懒加载--lazyload.js的用法
  4. LInux基础(04)项目设计一(理解链表管理协议的代码架构)
  5. springboot+mybatis实现数据库的读写分离
  6. 怎么删除json 键值对
  7. 牛客CSP-S提高组赛前集训营2 T2沙漠点列
  8. Python进阶(八)----模块,import , from import 和 `__name__`的使用
  9. 【面试突击】- Java面试总则
  10. 【转载】C#中List集合使用GetRange方法获取指定索引范围内的所有值