次元传送门:洛谷P1514

思路

可以证明如果有解 那么每个蓄水池可以覆盖到的干旱区必定是线段

证明:

举个栗子

8 9 8

7 9 7

6 9 6

明显到不了中间的点 如果不是连续的线段 中间肯定有一个点到不了 无解

那么我们就可以从每个开头城市进行DFS 并且同时递归计算每个点可以到达的最左边和最右边

最后进行一个线段覆盖问题解决

注意最左边是取最小值 最右边是取最大值

代码

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 505
int dx[]={,,,-},
dy[]={,-,,};
int n,m,ans,sum,num;
int high[maxn][maxn],l[maxn][maxn],r[maxn][maxn];
bool vis[maxn][maxn],k;
void dfs(int x1,int y1)
{
vis[x1][y1]=;
for(int i=;i<;i++)//枚举方向
{
int x2=x1+dx[i];
int y2=y1+dy[i];
if(x2>=&&x2<=n&&y2>=&&y2<=m&&high[x2][y2]<high[x1][y1])//判断条件
{
if(!vis[x2][y2]) dfs(x2,y2);//如果下一个点没有被遍历过 进行遍历
l[x1][y1]=min(l[x1][y1],l[x2][y2]);//递归时计算最右边和最左边
r[x1][y1]=max(r[x1][y1],r[x2][y2]);
}
}
}
int main()
{
memset(l,0x3f,sizeof(l));//因为取最小值 所以赋值为极大值
cin>>n>>m;
for(int i=;i<=m;i++) l[n][i]=r[n][i]=i;//初始化边界(最下面一行)
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) cin>>high[i][j];
for(int i=;i<=m;i++)
{
if(vis[][i]==)//如果这个城市没有试过且没有被其他蓄水池到达过
dfs(,i);//进行搜索
}
for(int i=;i<=m;i++)//判断是否有解
if(!vis[n][i])//如果最后一行有一个没有被到达过的点 即无解
{
num++;//计算有几个不能到达
k=;
}
if(k)//无解
{
cout<<<<endl<<num;
return ;
}
int now=;//线段覆盖
while(now<=m)//如果当前处在位置小于总长就继续
{
int maxr=;//当前区间可以覆盖到的最右边
for(int i=;i<=m;i++)//枚举区间
if(l[][i]<=now) maxr=max(maxr,r[][i]);//计算最右边
sum++;//增加数量
now=maxr+;//计算最左边
}
cout<<<<endl<<sum;
}

【题解】洛谷P1514 [NOIP2010TG] 引水入城(DFS+DP)的更多相关文章

  1. 洛谷 P1514 【引水入城】

    题库 :洛谷 题号 :1514 题目 :引水入城 link :https://www.luogu.org/problemnew/show/P1514 思路 :搜索从第一排开始能覆盖最后一排的区间L ~ ...

  2. [洛谷P1514] NOIP2010 引水入城

    问题描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  3. 洛谷 1514 (NOIp2010) 引水入城

    题目:https://www.luogu.org/problemnew/show/P1514 如果有解,一个第一行的格子能覆盖第n行的一定是一个连续的区间. 因为如果不连续,则有围住了一些第n行的格子 ...

  4. 洛谷 P 1514 引水入城==Codevs 1066

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  5. 洛谷P1514 引水入城——dfs

    题目:https://www.luogu.org/problemnew/show/P1514 搜索+DP: 自己想出来的方法第一次80分好高兴! 再改了改就A了,狂喜乱舞: 也就是 dfs,仔细一想第 ...

  6. 题解 Luogu P1514 【引水入城】

    有一种神奇的算法叫做floodfill 就是一个n*m的矩阵,a[i][j]为当前高度,我们可以任选一个点倒水,开始bfs,如果要搜的点没有被搜到过,并且高度小于当前的点,我们就把这个点加入队列中 而 ...

  7. P1514 引水入城 DFS

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个NN 行\times M×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...

  8. 【五一qbxt】day7-1 引水入城

    [noip2010 洛谷p1514]引水入城 Before: 线段覆盖问题#1:(我们所需要的) 一个区间,若干条线段,现在求最少多少条线段覆盖满整个区间 区间长度8,可选的覆盖线段[2,6],[1, ...

  9. 洛谷P1514 [NOIP2010提高组T4]引水入城

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...

随机推荐

  1. git 命令收藏

    git init # 初始化本地git仓库(创建新仓库)   git config --global user.name "xxx" # 配置用户名   git config -- ...

  2. Windows API 编程----将错误代码转换成错误描述信息

    Windows编程有时会因为调用函数而产生错误,调用GetLastError()函数可以得到错误代码.如果错误代码为0,说明没有错误:如果错误代码不为0,则说明存在错误. 而错误代码不方便编程人员或用 ...

  3. How to install the NVIDIA drivers on Ubuntu 18.04 Bionic Beaver Linux

    Objective The objective is to install the NVIDIA drivers on Ubuntu 18.04 Bionic Beaver Linux. This a ...

  4. Android--Otto事件总线 -- 组件之间通讯框架使用 --模式解析

    前言:Otto事件总线 -- 组件之间通讯框架 对于之前的情况activity之间或者fragment之间等跳转传值一般都是用bundle.intent等,从activityA --- activit ...

  5. 第4课 简易浏览器-WebViewer组件的使用方法

    做一个手机浏览器,需要哪些组件呢? 一.组件设计 二.组件属性及命名修改 三.逻辑设计 1.导航按钮代码:前进.后退.主页 2.访问网页按钮 1)根据用户在地址栏输入的地址书写,判断书写中是否含有“h ...

  6. libcurl 使用

    关于libcurl的文章网络上很多, 这里不再描述. 以下是如何使用libcurl的例子.   一.常用函数     1) libcurl的全局初始化及释放 CURLcode curl_global_ ...

  7. Redux学习笔记-基础知识

      Redux概述 是什么:Redux是管理状态的容器,提供可预测的状态管理. 怎么做:Redux主要是用来管理组件或者应用的状态,本质上跟一个事件处理器差不多.通过分发action触发reduce来 ...

  8. LearnHowToThink

    一.BubbleSort and XListview 1.BubbleSort (1)analysis traverse.compare.exchange.cycle.optimize strateg ...

  9. MySQL数据操作(借鉴)

    /* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld ...

  10. MySQL存储过程和临时表

    MySQL创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...