http://www.lydsy.com/JudgeOnline/problem.php?id=2143

分层图最短路

把能够弹跳的曼哈顿距离看做能量

dp[i][j][k]表示在(i,j)位置,还有能量k的最少花费

弹跳的曼哈顿距离增加1,能量减1

当能量减为0时,花费费用充满能量

#include<queue>
#include<cstdio>
#include<iostream> #define N 151 typedef long long LL; const LL inf=1e17; using namespace std; int n,m;
int energy[N][N],cost[N][N]; int X[],Y[]; LL dp[N][N][N<<];
bool vis[N][N][N<<]; int dx[]={,-,,,};
int dy[]={,,,,-}; struct node
{
int x,y,k;
LL val; node(int x_=,int y_=,int k_=,int val_=) :x(x_),y(y_),k(k_),val(val_) {} bool operator < (node p) const
{
return val>p.val;
} }now; priority_queue<node>q; void read(int &x)
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} void dijkstra(int e)
{
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
for(int k=;k<=n+m-;++k)
{
dp[i][j][k]=inf;
vis[i][j][k]=false;
}
while(!q.empty()) q.pop();
vis[X[e]][Y[e]][]=true;
dp[X[e]][Y[e]][energy[X[e]][Y[e]]]=cost[X[e]][Y[e]];
now.x=X[e];
now.y=Y[e];
now.k=energy[now.x][now.y];
now.val=cost[now.x][now.y];
q.push(now);
int sx,sy,nx,ny,k;
while(!q.empty() && (!vis[X[]][Y[]][] || !vis[X[]][Y[]][] || !vis[X[]][Y[]][]))
{
now=q.top();
q.pop();
sx=now.x; sy=now.y; k=now.k;
if(vis[sx][sy][k]) continue;
vis[sx][sy][k]=true;
if(now.k)
{
for(int i=;i<;++i)
{
nx=now.x+dx[i];
ny=now.y+dy[i];
if(nx<= || nx>n || ny<= || ny>m) continue;
if(dp[sx][sy][k]<dp[nx][ny][k-])
{
dp[nx][ny][k-]=dp[sx][sy][k];
q.push(node(nx,ny,k-,dp[nx][ny][k-]));
}
}
}
else
{
if(dp[sx][sy][]+cost[sx][sy]<dp[sx][sy][energy[sx][sy]])
{
dp[sx][sy][energy[sx][sy]]=dp[sx][sy][]+cost[sx][sy];
q.push(node(sx,sy,energy[sx][sy],dp[sx][sy][energy[sx][sy]]));
}
}
}
} int main()
{
int x;
read(n); read(m);
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
{
read(x);
energy[i][j]=min(x,max(i-,n-i)+max(j-,m-j));
}
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
read(cost[i][j]);
for(int i=;i<=;++i)
read(X[i]),read(Y[i]);
LL ans=inf; char pos;
dijkstra();
LL a1=dp[X[]][Y[]][],a2=dp[X[]][Y[]][];
dijkstra();
LL b1=dp[X[]][Y[]][],b2=dp[X[]][Y[]][];
dijkstra();
LL c1=dp[X[]][Y[]][],c2=dp[X[]][Y[]][];
if(b1+c1<ans) ans=b1+c1,pos='X';
if(a1+c2<ans) ans=a1+c2,pos='Y';
if(a2+b2<ans) ans=a2+b2,pos='Z';
if(ans>=inf) printf("NO");
else printf("%c\n%lld",pos,ans);
return ;
}

bzoj千题计划225:bzoj2143: 飞飞侠的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划174:bzoj1800: [Ahoi2009]fly 飞行棋

    http://www.lydsy.com/JudgeOnline/problem.php?id=1800 圆上两条直径构成矩形的对角线 #include<cstdio> using nam ...

  3. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  4. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  5. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  6. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  7. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  8. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  9. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

随机推荐

  1. stl源码剖析 详细学习笔记 算法(5)

    //---------------------------15/04/01---------------------------- //inplace_merge(要求有序) template< ...

  2. NodeJS旅程 : module 不可忽略的重点

    modules 模块的简介 Module 是Node.js中最重要的一个部分也是进行深度开发前的必修课.掌握Module才能真正理解NodeJS的精髓,你会发现从思路上会有极大的扩展.  学会写mod ...

  3. Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法

    一.背景介绍 强连通分量是有向图中的一个子图,在该子图中,所有的节点都可以沿着某条路径访问其他节点.强连通性是一种非常重要的等价抽象,因为它满足 自反性:顶点V和它本身是强连通的 对称性:如果顶点V和 ...

  4. Ing_制作在线QQ

    制作在线QQ的具体步骤 1.首先登录到http://is.qq.com/webpresence/code.shtml 网站2.选择风格3.填写相关数据4.生成网页代码5.复制代码到“写字板”,另存文件 ...

  5. cocos2d-x学习之路(一)——安装cocos2d-x

    这两天想从pygame和SDL换到cocos2d-x上(主要还是为了跨平台开发),所以这里先来看看如何安装cocos2d-x. 首先到官网去下载cocos2d-x:传送门 点击上方菜单栏的Produc ...

  6. Linux内核分析— —计算机是如何工作的(20135213林涵锦)

    实验部分 (以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用 gcc –S –o main.s main.c -m32 命令编译成汇编代码, int g(i ...

  7. ElasticSearch 2 (12) - Shard数调优(ElasticSearch性能)

    ElasticSearch 2 (12) - Shard数调优(ElasticSearch性能) 摘要 当创建一个索引的时候,我们经常会面对一个问题:要为索引分配多少个shard?多少个replica ...

  8. Beta 冲刺 三

    团队成员 051601135 岳冠宇 031602629 刘意晗 031602248 郑智文 031602330 苏芳锃 031602234 王淇 照片 项目进展 岳冠宇 ## 项目进展 昨天的困难 ...

  9. Python爬虫:抓取新浪新闻数据

    案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...

  10. Enum 枚举值 (一) 获取描述信息

    封装了方法: public static class EnumOperate { public class BaseDescriptionAttribute : DescriptionAttribut ...