次元传送门:洛谷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. cygwin 的安装和配置

         Cygwin是一个在windows平台上运行的类UNIX模拟环境,是cygnus solutions公司开发的自由软件(该公司开发的著名工具还有eCos,不过现已被Redhat收购).它对于 ...

  2. Android的消息机制简单总结

    参考文章: http://gityuan.com/2015/12/26/handler-message-framework/#next 参考资料: Android Framework的源码: Mess ...

  3. python 之 os._exit() sys.exit() 、exit()

    sys.exit 执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法. 退出程序引发SystemExit异常,(这是唯一一个不会被认为是 ...

  4. Docker问题集合

    1. 安装后启动出现 解决办法: 删除以下文件夹重新启动docker服务即可: 可能原因:(1) 之前docker进程出现错误并保存在keys.json文件中 (2) 删除之前配置了阿里云镜像,生成了 ...

  5. OGC 的 WMS、WFS 及WCS服务(转)

    OGC——Open Geospatial Consortium——开放地理信息联盟,是一个非盈利的志愿的国际标准化组织,引领着空间地理信息标准及定位基本服务的发展目前在空间数据互操作领域,基于公共接口 ...

  6. android中的内部存储与外部存储

    我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...

  7. Magisk+Xposed+Root switch+Pokémon GO

    If you follow Android Police, there's a good chance you've got a rooted device, whether it be an eas ...

  8. 07_Redis事务

    [简述] 事务是指一系列的操作步骤,着一些列的操作步骤,要么完全地执行,要不完全地不执行. 比如微博中: A用户关注了B用户,那么A的关注列表里就会有B用户,B用户的粉丝列表里就会有A用户. 这个关注 ...

  9. jquery 事件监听方法

    一.事件监听方法 mouseover()   鼠标移入事件方法 mouseout()    鼠标移出事件方法 mouseenter()  鼠标移入事件方法 mouseleave()  鼠标移出事件方法 ...

  10. 新开篇关于vue

    参考链接:http://cn.vuejs.org/v2/guide/instance.html 了解vue组件的生命周期: 1.beforeCreate 即将创建 2.created 创建 3.bef ...