题目描述



分析

很好的一道网格中的\(DP\)题

我们设\(f[x][y]\)为小象到达坐标为\((x,y)\)的点时看到的最少的老鼠的数量

但是这样定义是不好转移的,因为小象可能从上面的格子转移下来,也可能从上面的格子转移过来

所以我们用三维数组记录状态,我们设\(f[x][y][0]\)为当前格子从正上方的格子转移过来所看到的最少的老鼠的数量

\(f[x][y][1]\)为当前格子从正左方的格子转移过来所看到的最少的老鼠的数量

我们来分情况讨论一下

无非是考虑当前的位置和当前上下左右的\(4\)个格子,去一下重

1、当前格子从正上方转移过来,当前格子正上方的格子也由正上方的格子转移过来

此时当前格子的价值\(a[i][j]\)已经在\(f[i-1][j][0]\)中计算过

而当前格子正上方的格子的价值\(a[i-1][j]\)已经在\(f[i-2][j][0]\)或\(f[i-2][j][1]\)中计算过

\[f[i][j][0]=min(f[i][j][0],f[i-1][j][0]+a[i][j-1]+a[i][j+1]+a[i+1][j]);
\]

2、当前格子从正上方转移过来,当前格子正上方的格子由正左方的格子转移过来

此时当前格子的价值\(a[i][j]\)已经在\(f[i-1][j][1]\)中计算过

当前格子正左方格子的价值\(a[i][j-1]\)已经在\(f[i-1][j-1][1]\)或\(f[i-1][j-1][0]\)中计算过

当前格子正上方格子的价值\(a[i-1][j]\)也已经在\(f[i-1][j-1][1]\)或\(f[i-1][j-1][0]\)中计算过

\[f[i][j][0]=min(f[i][j][0],f[i-1][j][1]+a[i][j+1]+a[i+1][j]);
\]

3、当前格子从正左方转移过来,当前格子正左方的格子也由正左方的格子转移过来

此时当前格子的价值\(a[i][j]\)已经在\(f[i][j-1][1]\)中计算过

当前格子正左方格子的价值\(a[i][j-1]\)已经在\(f[i][j-2][1]\)或\(f[i][j-2][0]\)中计算过

\[f[i][j][1]=min(f[i][j][1],f[i][j-1][1]+a[i-1][j]+a[i][j+1]+a[i+1][j]);
\]

4、当前格子从正左方转移过来,当前格子正左方的格子由正上方的格子转移过来

此时当前格子的价值\(a[i][j]\)已经在\(f[i][j-1][0]\)中计算过

当前格子正左方格子的价值\(a[i][j-1]\)已经在\(f[i-1][j-1][1]\)或\(f[i-1][j-1][0]\)中计算过

当前格子正上方格子的价值\(a[i-1][j]\)也已经在\(f[i-1][j-1][1]\)或\(f[i-1][j-1][0]\)中计算过

\[f[i][j][1]=min(f[i][j][1],f[i][j-1][0]+a[i][j+1]+a[i+1][j]);
\]

要注意初始化

\[f[1][1][0]=f[1][1][1]=a[1][1]+a[1][2]+a[2][1];
\]

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1055;
int a[maxn][maxn],f[maxn][maxn][3];
int main(){
memset(f,0x3f,sizeof(f));
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
f[1][1][0]=f[1][1][1]=a[1][1]+a[1][2]+a[2][1];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f[i][j][0]=min(f[i][j][0],f[i-1][j][0]+a[i][j-1]+a[i][j+1]+a[i+1][j]);
f[i][j][0]=min(f[i][j][0],f[i-1][j][1]+a[i][j+1]+a[i+1][j]);
f[i][j][1]=min(f[i][j][1],f[i][j-1][1]+a[i-1][j]+a[i][j+1]+a[i+1][j]);
f[i][j][1]=min(f[i][j][1],f[i][j-1][0]+a[i][j+1]+a[i+1][j]);
}
}
printf("%d\n",min(f[n][m][0],f[n][m][1]));
return 0;
}

P2295 MICE 网格中的DP的更多相关文章

  1. VMware 设备VMnet0 上的网桥暂时关闭。此虚拟机无法与主机或网格中的其他计算机通信【转】

    今天克隆了一个win7的虚拟机,移动到我的本地.打开时发现虚拟机网格连接图标出现X断开连接,于是网上收了一堆答案无一个可用的,决定自己解决这个问题,解决过程如下: 1.报错图如下:设备VMnet0 上 ...

  2. csuoj 1117: 网格中的三角形

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1117 1117: 网格中的三角形 Time Limit: 3 Sec  Memory Limit: ...

  3. 【转】Android中dip(dp)与px之间单位转换

    Android中dip(dp)与px之间单位转换 dp这个单位可能对web开发的人比较陌生,因为一般都是使用px(像素)但是,现在在开始android应用和游戏后,基本上都转换成用dp作用为单位了,因 ...

  4. Android中dip, dp, px,pt, sp之间的区别:

    Android中dip.dp.sp.pt和px的区别   1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更 ...

  5. 网格中的BFS,逆向(POJ2049)

    题目链接:http://poj.org/problem?id=2049 解题报告: 网格中的BFS,最主要的是边界问题. 1.这里在左右,上下两个方向上,分别判断墙,和门,细节是,向上有t个墙,for ...

  6. 搜索(BFS)---计算在网格中从原点到特定点的最短路径长度

    计算在网格中从原点到特定点的最短路径长度 [[1,1,0,1], [1,0,1,0], [1,1,1,1], [1,0,1,1]] 题目描述: 1表示可以经过某个地方,求解从(0,0)位置到(tr,t ...

  7. sigma网格中水平压力梯度误差及其修正

    1.水平梯度误差产生 sigma坐标系下,笛卡尔坐标内水平梯度项对应形式为 \[\begin{equation} \left. \frac{\partial }{\partial x} \right| ...

  8. Istio(十一):向istio服务网格中引入虚拟机

    目录 一.模块概览 二.系统环境 三.虚拟机负载 3.1 虚拟机负载 3.2 单网络架构 3.3 多网络架构 3.4 Istio 中如何表示虚拟机工作负载? 四.实战:向istio Mesh中引入虚拟 ...

  9. Android系统中的dp和px的转换

    android系统中DP和SP的转化:1.首先分析TypedValue.java 可以调用以下代码获得dp的值 TypedValue.applyDimension(TypedValue.COMPLEX ...

随机推荐

  1. AndroidCamera开发学习笔记01

    概述 Android框架支持设备的相机拍照和录像功能 可以直接调用系统的Camera应用来拍照或录像 也可以利用Adroid系统提供的API开发Camera应用来实现拍照和录像的功能 注意事项 需要硬 ...

  2. JSP+Structs+JDBC+mysql实现的诚欣电子商城

    项目简介 项目来源于:https://github.com/SuperiorNature/Java-Enterprise-electronic-mall 本系统是基于JSP+Structs+JDBC+ ...

  3. 关于mysql auto-increment

    创建表语句如下mysql> show create table Tautoincrement\G *************************** 1. row ************* ...

  4. vue2.0+Element UI 实现动态表单(点击按钮增删一排输入框)

    对于动态增减表单项,Element UI 官方文档表单那一节已经介绍得很清楚了,我之前没有看见,绕了很多弯路,这里针对点击按钮增删一排输入框的问题做一个总结. 效果图如下 存在一排必填的姓名与手机号, ...

  5. synchronized 和 java.util.concurrent.locks.Lock 的异同 ?

    主要相同点:Lock 能完成 synchronized 所实现的所有功能 主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能. synchronized 会自动释放锁,而 ...

  6. ZWave对COMAND CLASS的处理流程

    文章主题  在开发一个 ZWave Device 的过程中,对 COMAND CLASS(单词太长了,后面就简写为 CC 啦) 的处理是最基本.最重要的工作.这篇文章以最最简单的 CC:COMMNAD ...

  7. fiddler修改请求参数

    1.打开fiddler ,点击界面左侧左侧底部 2.此图标为before request请求(修改请求参数时,设置这个,可以修改请求参数) 3..再次点击该按钮,将图标切换到下图after respo ...

  8. Mybatis框架介绍

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.201 ...

  9. 面试必问系列之JDK动态代理

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  10. Beta冲刺<3/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第三天(05.21) 作业正文 如下 其他参考文献 ... B ...