【题解】洛谷P1514 [NOIP2010TG] 引水入城(DFS+DP)
次元传送门:洛谷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)的更多相关文章
- 洛谷 P1514 【引水入城】
题库 :洛谷 题号 :1514 题目 :引水入城 link :https://www.luogu.org/problemnew/show/P1514 思路 :搜索从第一排开始能覆盖最后一排的区间L ~ ...
- [洛谷P1514] NOIP2010 引水入城
问题描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...
- 洛谷 1514 (NOIp2010) 引水入城
题目:https://www.luogu.org/problemnew/show/P1514 如果有解,一个第一行的格子能覆盖第n行的一定是一个连续的区间. 因为如果不连续,则有围住了一些第n行的格子 ...
- 洛谷 P 1514 引水入城==Codevs 1066
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...
- 洛谷P1514 引水入城——dfs
题目:https://www.luogu.org/problemnew/show/P1514 搜索+DP: 自己想出来的方法第一次80分好高兴! 再改了改就A了,狂喜乱舞: 也就是 dfs,仔细一想第 ...
- 题解 Luogu P1514 【引水入城】
有一种神奇的算法叫做floodfill 就是一个n*m的矩阵,a[i][j]为当前高度,我们可以任选一个点倒水,开始bfs,如果要搜的点没有被搜到过,并且高度小于当前的点,我们就把这个点加入队列中 而 ...
- P1514 引水入城 DFS
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个NN 行\times M×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...
- 【五一qbxt】day7-1 引水入城
[noip2010 洛谷p1514]引水入城 Before: 线段覆盖问题#1:(我们所需要的) 一个区间,若干条线段,现在求最少多少条线段覆盖满整个区间 区间长度8,可选的覆盖线段[2,6],[1, ...
- 洛谷P1514 [NOIP2010提高组T4]引水入城
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...
随机推荐
- docker 安装ElasticSearch head
github官网地址 https://github.com/mobz/elasticsearch-head 拉取镜像 docker pull mobz/elasticsearch-head:5 创建容 ...
- 流畅的python和cookbook学习笔记(一)
1.数据结构 1.1 内置序列类型 四种序列类型: 1.容器序列:list.tuple和collections.deque 2.扁平序列:str.bytes.bytearray.memoryview和 ...
- [转]ubuntu 13.04 体验wine qq
1.首先安装最新版的wine1.52,没记错版本号应该是这个 sudo add-apt-repository ppa:ubuntu-wine/ppa sudo apt-get update sudo ...
- asp.net 、C#实现微信企业号OAuth2认证
以微信企业号作为入口的应用,几乎都会遇到需要应用系统中个人信息和微信用户关联问题.从而进行其他业务处理.目前所做项目采取在企业号通讯录添加自定义字段存入应用系统用户信息表中唯一标识UserGuid进行 ...
- MySQL在DOS界面对database和table增删改查
昨天新接触MySQL,学习了一些内容,今天过来复习一下.(吐槽一下:安装个MySQL耗费老子半天时间!!) 学习了一下,大概知道了对数据库基本的增删改查,增add,删drop,改alter,查show ...
- java.util.concurrent.CyclicBarrier 使用
1.概述 java.util.concurrent.CyclicBarrier(循环的栅栏), 构造时设置一个计数器数(count), 各线程通过调用barrier.await()进入等待,并且计数+ ...
- Python基础-模块与包
一.如何使用模块 上篇文章已经简单介绍了模块及模块的优点,这里着重整理一下模块的使用细节. 1. import 示例文件:spam.py,文件名spam.py,模块名spam #spam.py pri ...
- C#虚基类继承与接口的区别
类:定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指定或 ...
- Codeforces Round #411 (Div. 2) C. Find Amir
C. Find Amir time limit per test 1 second memory limit per test 256 megabytes A few years ago ...
- 06_javassist
[简述] Javassist是一个开源的java字节码操作工具,主要是对已经编译好class文件进行修改和处理,可以直接检查.修改.创建 java类. [javassist实例] package co ...