noip _模拟1_1

小象和老鼠 CH Round #15 -【Nescafé 31】杯NOIP模拟赛

描述

S国的动物园是一个N*M的网格图,左上角的坐标是(1,1),右下角的坐标是(N,M)。
小象在动物园的左上角,它想回到右下角的家里去睡觉,但是动物园中有一些老鼠,而小象又很害怕老鼠。动物园里的老鼠是彼此互不相同的。小象的害怕值定义为他回家的路径上可以看见的不同的老鼠的数量。若小象当前的位置为(x1,y1),小象可以看见老鼠,当且仅当老鼠的位置(x2,y2)满足|x1-x2|+|y1-y2|<=1。由于小象很困了,所以小象只会走一条最近的路回家,即小象只会向下或者向右走。现在你需要帮小象确定一条回家的路线,使得小象的害怕值最小。

输入格式

第一行包含两个用空格隔开的整数,N和M。
接下来一个N*M的矩阵表示动物园的地图。其中Aij表示第i行第j列上老鼠的数量。若Aij=0则表示当前位置上没有老鼠(小象的家里也可能存在老鼠)。

输出格式

输出一个整数,表示路线最小的害怕值是多少。

样例输入

3 9
0 0 1 0 0 0 0 0 1
1 1 1 1 1 1 0 1 0
1 0 0 1 0 0 1 0 0

样例输出

9

数据范围与约定

  • 对于10%的数据,1<=N,M<=5。
  • 对于100%的数据,1<=N,M<=1000,0<=Aij<=100。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<set>
using namespace std;
#define INF 1<<30
int n,m,f[1010][1010][2],a[1010][1010];
int main()
{
      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=2;i<=n;i++)
            f[i][1][0]=f[i-1][1][0]+a[i][2]+a[i+1][1],f[i][1][1]=INF;
      for(int j=2;j<=m;j++)
            f[1][j][1]=f[1][j-1][1]+a[1][j+1]+a[2][j],f[1][j][0]=INF;
      for(int i=2;i<=n;i++)
            for(int j=2;j<=m;j++)
            {
                  f[i][j][0]=min(f[i-1][j][0]+a[i][j-1],f[i-1][j][1])+a[i][j+1]+a[i+1][j];
                  f[i][j][1]=min(f[i][j-1][0],f[i][j-1][1]+a[i-1][j])+a[i][j+1]+a[i+1][j];
            }
      printf("%d\n",min(f[n][m][0],f[n][m][1]));
      return 0;
}

  

时间: 2024-08-25 13:32:22

noip _模拟1_1的相关文章

03-02自底向上风格_模拟游戏

模拟游戏 模拟井字棋游戏 九个格子中双方轮流落子. 其中一方画x符号,另一方画o符号. 开始时,9个格子都是空的. 程序显示当前局面,提示某一方输入落子位置,然后显示局面,再提示另一方. 当某方棋子连成直线,该方获胜! 例如: 初始: _ _ _ _ _ _ _ _ _ o 输入位置: 1,1 o _ _ _ _ _ _ _ _ x 输入位置: 2,2 o _ _ _ x _ _ _ _ 当某一方出现了3个棋子连成直线或对角线,则该方获胜 标准答案: import java.util.*; cl

C#_模拟webAp_POST-GET-PUT-DELETE

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using System.Web; namespace WebAPIClientDemo { public class RestClient { private string BaseUri; public RestClient(string baseUri

HDU 4941 Magical Forest _(:зゝ∠)_ 模拟题

模拟大法保平安_(:зゝ∠)_ #include <cstdio> #include <map> #include <set> #include <algorithm> using namespace std; const int N = 1; struct node{ int x, y, val; node(int a=0,int b=0,int c=0):x(a),y(b),val(c){} bool operator<(const node&am

python爬虫学习(3)_模拟登陆

1.登陆超星慕课,chrome抓包,模拟header,提取表单隐藏元素构成params. 主要是验证码图片地址,在js中发现由js->new Date().getTime()时间戳动态生成url,python对应time.time(),生成验证码图片url,图片下载在本地,手动输入.代码如下: #coding=utf-8 import requests import time from bs4 import BeautifulSoup header={ 'Referer':'http://aus

零基础逆向工程40_Win32_14_枚举窗口_模拟鼠标键盘

1 查找窗口 1.1 代码案例 //查找指定窗口 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770"),TEXT("飞鸽传书 IP Messenger")); if(hwnd != NULL) { //修改窗口标题 ::SetWindowText(hwnd,"新的窗口标题"); } else { ::MessageBox(NULL,TEXT("窗口没

jzoj 3519_灵能矩阵_模拟

题目描述 Protoss 的灵能矩阵由若干个节点所构成.它们构成了一棵有根树,树根为1 号节点.定义没有子节点的节点为叶节点.叶节点内储存着一定量的能量,而非叶节点的能量为它子树中所有叶节点的能量之和. 如果一个节点的每一个子节点的能量都相同,那么这个节点就是能量平衡的.如果矩阵内每一个节点都能量平衡,则这个矩阵是能量平衡的. 被你所接管的这个灵能矩阵,似乎在长期的废弃之后已经无法保持的能量的平衡.为了重新让矩阵平衡,你可以通过将叶节点储存的能量散逸到太空中.你不可以使一个叶节点储存的能量为负数

node.js学习笔记_模拟路由

路由就是浏览器输入url地址,服务端根据对url地址的解析,访问对应的代码模块.var    http    =    require('http');var    url    =    require('url');var    router    =    require('./router');http.createServer(function    (request,    response)    {        response.writeHead(200,    {'Cont

【NOIP考前模拟赛】纯数学方法推导——旅行者问题

一.写在前面 这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:http://pan.baidu.com/s/1mibdMXi),诸位看官需者自取.另外博主使用此题并没有获得出题人授权,如果出题人看到这篇blog并认为在下侵犯了您的权利,请用站内消息与在下联系,在下会立即删除这篇blog,给您带来的困扰之处敬请谅解. 博主上传这道题主要是因为这题牵扯许多数学运算,推导过程比较复杂,但是却没有用到任何算法或者数学定理,可以说这是一道想法题的典范.

SSL 2676_数学_模拟

题目描述 小A得到了一个数列A,他告诉你这个数列中所有的A[i]都是1到n的自然数,并且告诉你对于一些A[i]不能取哪些值.无聊的你想要知道所有可能的数列的积的和.定义一个数列的积为这个数列所有数的乘机.由于答案太大,只要模10^9+7输出即可. 思路 首先有一个规律就是ans为每一项中没有被限制的数相加让后相乘 显然这样直接暴力会T,数据中的限制有 $10^5$ 个,而总数则有$10^9$ 个 所以没有限制条件的数量还是很多的,我们就可以用一个快速幂加上暴力来求解 #include <stdi