题意: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}\) 转移过来。

具体而言,转移方程如下:

\[f_{i,j}=\min
\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 提高组] 引水入城 题解的更多相关文章

  1. [NOIP2010提高组]引水入城

    题目:洛谷P1514.Vijos P1777.codevs1066. 题目大意:有一个$n×m$的矩阵,每个点都有一个高度,可以在第一行的任意点建立蓄水厂.现在要把水输到最后一行的所有点上,规定水只能 ...

  2. luoguP1514 引水入城 题解(NOIP2010)(Bfs+贪心)

    P1514 引水入城  题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...

  3. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  4. NOIP2010 引水入城 题解

    http://www.rqnoj.cn/problem/601 今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发. 要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市 ...

  5. Codevs 1066 引水入城 2010年NOIP全国联赛提高组

    1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...

  6. 引水入城 2010年NOIP全国联赛提高组(bfs+贪心)

    1066 引水入城 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 在一个遥远 ...

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

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

  8. CODEVS 1066/洛谷 P1514引水入城

    1066 引水入城 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 在一个遥远的国 ...

  9. 洛谷P1514 引水入城

    洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG ...

  10. 洛谷 P1514 引水入城 解题报告

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

随机推荐

  1. Springboot集成easypoi实现excel多sheet导出

    1.环境配置 <!--easypoi依赖,excel导入导出--> <dependency> <groupId>cn.afterturn</groupId&g ...

  2. Deepseek学习随笔(1)--- 初识 DeepSeek

    什么是 DeepSeek? DeepSeek 是一款基于人工智能的对话工具,旨在帮助用户高效完成各种任务,包括文本生成.代码编写.数据分析等.通过自然语言处理技术,DeepSeek 能够理解用户的输入 ...

  3. Arduino LED流水灯·基础实验

    Arduino初学IO控制,流水灯实验是很好的学习对象.分两个进程学习. 一.假流水灯,即基础效果实现 二.真流水灯,即采用PWM模拟真实流水渐变效果 我们设立5盏灯,正极分别连接数字口(Digita ...

  4. 【Python】尝试切换py版本

    失败 问chatgpt,怎么把abaqus python 版本切换到py3.6,结果失败. chatgpt给出的建议: 修改abaqus_v6.env,明显扯淡!我就尝试在custom_v6.env中 ...

  5. excel 日期列显示到日

    原来显示 效果图: 步骤

  6. Mysql join算法深入浅出

    导语 联表查询在日常的数据库设计中非常的常见,但是联表查询可能会带来性能问题,为了调优.避免设计出有性能问题的SQL,在explain命令中,会显示用的是哪个join算法,学习一下join过程是非常有 ...

  7. k8s v1.16.3,Unable to connect to the server: x509: certificate has expired or is not yet valid

    前言 kubernetes 版本为 v1.16.3 使用 kubelet get node 后报错: x509: certificate has expired or is not yet valid ...

  8. JS处理数据四舍五入(tofixed与round的区别详解)

    1 .tofixed方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.例如将数据Num保留2位小数,则表示为:toFixed(Num):但是其四舍五入的规则与数学中的规则 ...

  9. VMware ESXi系统

    esxi全称"VMware ESXi",是可直接安装在物理服务器上的强大的裸机管理系统,是一款虚拟软件,不需安装其他操作系统,是VMware服务器虚拟化的基础.通过直接访问并控制底 ...

  10. 窗体添加按钮--java进阶day03

    1.组件.面板对象 窗体中的图片.按钮.文本都是组件,光创建出了窗体没有组件肯定不行,但是这些组件该放到窗体的哪个位置? 很明显是窗体中空白的位置,但是我们需要知道,这块空白位置在窗体中是一个被封装的 ...