P1514 [NOIP 2010 提高组] 引水入城 题解
题意:P1514 [NOIP 2010 提高组] 引水入城有点复杂,自己看吧。
思路
这里提供一个好像没见过的纯 DP 做法,不需要神秘的证明以及任何脑子,直接顺着思路做即可。
首先判断正确性就是从第一行的每一个点开始暴力搜索,看最后一行有没有点没被走到。最坏情况下第一行的每个点都会遍历以它自己为矩形左上角,地图右下角为右下角的整个矩形(类似于一个地图后缀)。因此搜索总复杂度为 \(O(mn^2)\)。
在搜索的同时,我们发现我们可以记下从第一行的每个格子能够到达哪些最后一行的格子。这个东西是类比于建图的,我们用邻接矩阵存下来。我们这里设 \(bian_{i,j}=0/1\) 表示第一行的某个点 \(i\) 可以到达最后一行的某个点 \(j\)。
然后就是 DP 了。我们设 \(f_{i,j}\) 表示在水能填满最后一行前 \(i\) 个格子的前提下,仅能使用第一行前 \(j\) 个格子建造蓄水厂的最小数量。
由于每一步都要保证最后一行前 \(i\) 个格子是被填满的,因此直接暴力枚举从最后一行什么地方转移即可,设转移的地方为 \(k\)。但是我么还要保证从 \(k+1\) 到 \(i\) 的这些最后一行的格子一定会被填满,因此要么是 \(j-1\) 及其以前的第一行的点就已经可以填满前 \(i\) 个格子了,要么是当前这个点 \(j\) 可以填满 \(k+1\) 到 \(i\) 之间的所有格子,从 \(f_{k,j-1}\) 转移过来。
具体而言,转移方程如下:
\left\{\begin{matrix}
f_{i,j-1} &\\
f_{k,j-1}+1 &,k\in [0,i-1]\wedge [k+1,i]\text{都可以被} j\text{完全覆盖}
\end{matrix}\right.
\]
再次强调一下这里的 \(i,k\) 是最后一行上的点,\(j\) 是第一行上的点。
边界条件即为 \(f_{0,i}=0\),答案为 \(f_{m,m}\)。(不得不说 ccf 数据真的水,我刚开始只把 \(f_{0,0}\) 赋值为零得了 90 分,意味着只有一个测试点不在第一行第一个点上建蓄水厂)
然后 DP 枚举了 \(i,j,k\) 三个变量,复杂度 \(m^3\)。由于 \(n,m\) 同阶,因此总复杂度 \(n^3\) 大概可以过。
code
实现细节上在 \(f_{i,j}\) 从 \(k\) 处转移时取了个巧。我们将 \(k\) 倒序枚举使得当 \(bian_{j,k+1}\) 不为 1 的时候直接 break 即可。(注意我们始终保持的都是 \([k+1,i] \text{都可以被} j \text{完全覆盖}\))
最后代码很短,好写好调。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=505;
int n,m,mp[N][N],sign[N],lx[5]={0,0,1,-1},ly[5]={1,-1,0,0},bian[N][N],f[N][N],dfn[N][N];
void dfs1(int u,int x,int y){
if(dfn[x][y]) return ;dfn[x][y]=1;
if(x==n) bian[u][y]=1,sign[y]=1;
for(int i=0;i<4;i++) if(x+lx[i]>=1&&x+lx[i]<=n&&y+ly[i]>=1&&y+ly[i]<=m&&mp[x][y]>mp[x+lx[i]][y+ly[i]]) dfs1(u,x+lx[i],y+ly[i]);
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>mp[i][j];
for(int i=1;i<=m;i++) memset(dfn,0,sizeof(dfn)),dfs1(i,1,i);
int cnt=0;
for(int i=1;i<=m;i++) if(!sign[i]){cnt++;}
if(cnt){cout<<"0\n";cout<<cnt<<'\n';return 0;}
memset(f,0x3f3f,sizeof(f));
for(int i=0;i<=m;i++) f[0][i]=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
for(int k=i-1;k>=0;k--) f[i][j]=min(f[i][j],f[i][j-1]);
for(int k=i-1;k>=0;k--){
if(!bian[j][k+1]) break;
f[i][j]=min({f[i][j],f[k][j-1]+1});
}
}
}
cout<<"1\n"<<f[m][m]<<'\n';
return 0;
}
P1514 [NOIP 2010 提高组] 引水入城 题解的更多相关文章
- [NOIP2010提高组]引水入城
题目:洛谷P1514.Vijos P1777.codevs1066. 题目大意:有一个$n×m$的矩阵,每个点都有一个高度,可以在第一行的任意点建立蓄水厂.现在要把水输到最后一行的所有点上,规定水只能 ...
- luoguP1514 引水入城 题解(NOIP2010)(Bfs+贪心)
P1514 引水入城 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...
- NOIP 2008提高组第三题题解by rLq
啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...
- NOIP2010 引水入城 题解
http://www.rqnoj.cn/problem/601 今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发. 要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市 ...
- Codevs 1066 引水入城 2010年NOIP全国联赛提高组
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...
- 引水入城 2010年NOIP全国联赛提高组(bfs+贪心)
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远 ...
- 洛谷P1514 [NOIP2010提高组T4]引水入城
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...
- CODEVS 1066/洛谷 P1514引水入城
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远的国 ...
- 洛谷P1514 引水入城
洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG ...
- 洛谷 P1514 引水入城 解题报告
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 NN 行 \times M×M 列的矩形,如上图所示,其中每个格 ...
随机推荐
- pycharm上传github问题:rejected
我从pycharm上传项目时,遇到的问题: 以下是一些解决思路: 这个错误提示表明,你在尝试将本地代码推送到远程仓库时,远程仓库中已经包含了你本地尚未获取的更改.换句话说,远程仓库的代码比你的本地代码 ...
- SMMS图床Java接口上传
前言 个人项目开发中,网站建设中需要用到大量的图片以及用户上传的图片,如果服务器带宽小,磁盘容量小将所有的图片信息全部存储在服务器上不太现实,这里建议将图片数据存储在对象存OSS上或者将图片保存在图床 ...
- WPF 控件库
1. wpftoolkit: https://archive.codeplex.com/?p=wpftoolkit 2. wpg : https://archive.codeplex.com/? ...
- [CF1981E] Turtle and Intersected Segments 题解
好题好题. 难点在建图,因为图的边数将会决定最小生成树的时间复杂度.我们肯定希望能够只建 \(O(n)\) 级别的边,这样时间复杂度就可以做到 \(O(n\log n)\). 观察到当 \(i,j,k ...
- IDEA - 文件上方的文档注释如何自定义
1.在设置中打开文件和代码模板,根据描述中的参考信息进行自定义配置 File > Settings > Editor > File and Code Templates 2.配置完成 ...
- Flink - [01] 概述
官网:https://flink.apache.org/ 一.Flink 是什么 是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布,数据通信以及容错机制等功能. 是一个框架和分布式处 ...
- 来自deepseek:php禁止跨域请求
在PHP中,禁止API被跨域调用可以通过设置HTTP响应头来实现.跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种机制,允许浏览器从不同域名的服务器请求资源. ...
- 添加xxx.so到环境变量里
点击查看代码 libxxx.so 文件位于 /usr/local/lib 目录下,你可以按照以下步骤操作: 创建配置文件: echo "/usr/local/lib" | sudo ...
- python 二级 第三方库(pip 、pyinstaller、jieba、wordcloud)
安装方式 首选pip安装,pip安装失败选择自定义安装.文件安装,一般windows系统pip安装有时会失败 pip安装 pip -h 查看指令 自定义安装 路径: https://www.scipy ...
- Selenium Javascript 滚动条操作
js在selenium有许多应用,最主要的有滚动条操作. 实现功能:进入百度搜索结果页->滚动条分别滚到到顶部.底部及指定元素位置. 使用格式: driver.execute_script('w ...