题目链接:https://www.luogu.com.cn/problem/P1514

题意大致是:给定一个(n,m)的数值矩阵,可以在第一行建造水库,如果一个格子周围的某格子值小于它,那水就可以流到它周围的那个格子,问需要在第一行建造多少水库使得最后一行能够被完全覆盖,如果不能完全覆盖就求出不能覆盖的格子的数量。

主要思路就是在第一行每个点出发的水能到达第n行的区间可以获得(可以用反证法证明每个点出发的水如果能到达第n行那么它的覆盖区间一定是连续的),如果能够完全覆盖第n行则用最小区间数覆盖可以求出最少需要多少个点可以覆盖第n行,

代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef unsigned int ui;
  4. typedef long long ll;
  5. typedef unsigned long long ull;
  6. #define pf printf
  7. #define mem(a,b) memset(a,b,sizeof(a))
  8. #define prime1 1e9+7
  9. #define prime2 1e9+9
  10. #define scand(x) scanf("%llf",&x)
  11. #define f(i,a,b) for(int i=a;i<=b;i++)
  12. #define scan(a) scanf("%d",&a)
  13. #define dbg(args) cout<<#args<<":"<<args<<endl;
  14. #define pb(i) push_back(i)
  15. #define ppb(x) pop_back(x)
  16. #define inf 0x3f3f3f3f
  17. #define maxn 1005
  18. int n,m,t,a[maxn][maxn],l[maxn][maxn],r[maxn][maxn],vis[maxn][maxn];
  19. //l[i][j]从(i,j)位置出发的水最多能覆盖到最后一行的左端的位置,
  20. //r[i][j]从(i,j)位置出发的水最多能覆盖到最后一行的最右端的位置
  21. int dir[][]={{,},{,-},{-,},{,}};
  22. void dfs(int x,int y)
  23. {
  24. vis[x][y]=true;//表明(x,y)位置的l,r信息都被处理过
  25. int xx,yy;
  26. f(i,,)
  27. {
  28. xx=x+dir[i][];
  29. yy=y+dir[i][];
  30. if(xx<=||xx>n||yy<=||yy>m)continue;
  31. if(a[xx][yy]>=a[x][y])continue;
  32. if(!vis[xx][yy])
  33. {
  34. dfs(xx,yy);
  35. }
  36. l[x][y]=min(l[x][y],l[xx][yy]);
  37. r[x][y]=max(r[x][y],r[xx][yy]);
  38. }
  39. }
  40. int main()
  41. {
  42. //freopen("input.txt","r",stdin);
  43. //freopen("output.txt","w",stdout);
  44. std::ios::sync_with_stdio(false);
  45. scan(n);
  46. scan(m);
  47. f(i,,n)
  48. f(j,,m)
  49. {
  50. scan(a[i][j]);
  51. }
  52. mem(l,inf);
  53. mem(r,-inf);
  54. f(,,m)
  55. {
  56. l[n][i]=r[n][i]=i;//最下面一层,初始情况区间只覆盖自己
  57. }
  58. f(i,,m)
  59. {
  60. if(!vis[][i])
  61. dfs(,i);
  62. }
  63. bool flag=true;
  64. int cnt=;
  65. f(i,,m)
  66. {
  67. if(!vis[n][i])
  68. {
  69. flag=false;
  70. cnt++;
  71. }
  72. }
  73. if(!flag)
  74. {
  75. pf("0\n%d",cnt);//有多少个点无法覆盖
  76. }
  77. else
  78. {
  79. int num=;
  80. int left=,maxr=;//最小区间数覆盖
  81. while(left<=m)
  82. {
  83. maxr=;
  84. f(i,,m)
  85. {
  86. if(l[][i]<=left)//找到覆盖left点的区间右端值的最大值
  87. maxr=max(maxr,r[][i]);
  88. }
  89. left=maxr+;
  90. num++;
  91. }
  92. pf("1\n%d\n",num);
  93. /* f(i,1,m)
  94. {
  95. pf("%d %d\n",l[1][i],r[1][i]);
  96. }*/
  97. }
  98. return ;
  99. }

洛谷1514 引水入域 dp+记忆化搜索的更多相关文章

  1. 【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)

    题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA  因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 ...

  2. luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)

    我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...

  3. [NOIP2010] 引水入城 贪心 + 记忆化搜索

    ---题面--- 题解: 本蒟蒻并没有想到bfs的做法,,,, 只会dfs了 首先我们需要知道一个性质. 我们设k[i].l 为在i点建立水库可以支援到的最左边的城市,k[i].r为最右边的. 那么点 ...

  4. 洛谷P4133 [BJOI2012]最多的方案(记忆化搜索)

    题意 题目链接 求出把$n$分解为斐波那契数的方案数,方案两两不同的定义是分解出来的数不完全相同 Sol 这种题,直接爆搜啊... 打表后不难发现$<=1e18$的fib数只有88个 最先想到的 ...

  5. 洛谷P1514 引水入城

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

  6. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  7. 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

  8. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  9. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

随机推荐

  1. 在JavaScript里的“对象字面量”是什么意思?

    字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量.字面量分为字符串字面量(string literal ).数组字面量(array literal)和对象字面量(ob ...

  2. TableViewComponent v2

    Unity UGUI 自带的 ScrollView 控件不支持复用滚动内容,在数量大的情况下,界面容易卡顿 借鉴其他游戏控件,写了个可复用的滚动组件,扩展.优化了ScrollView TableVie ...

  3. python django 之 django自带的分页

    1. 例1: 基础的分页    1). vim app01/views.py        def users(request):            from django.core.pagina ...

  4. Roma - Facebook工具链大一统

    什么是roma roma,中文名罗马,是Facebook的rn团队的产出,是一个试验性质的javascript工具链,集编译,linter,格式化,打包,测试等等于一体.目标是成为一个处理javasc ...

  5. 在ASP.NET Core Mvc 集成MarkDown

    这几天在做文章编辑,首先就想到了markdown,它比其它的都要新,而且很好用,相对于其它的html编辑器,好久不更新,要好得多,哦~对了我现在已经用上新版的Edge了,经过很多朋友测试,性能比谷歌浏 ...

  6. Java并发ReentrantLock

    ReentrantLock简介 可重入锁,作用是使线程安全.对比于sychronized,它能具有以下特点 减小资源锁的力度 更可控,减少发生死锁的概率 加锁.释放锁都是显示控制的 添加锁的作用时间来 ...

  7. c/s用户与服务器之间的传输

    ####第一页 <%@ page language="java" contentType="text/html; charset=UTF-8" pageE ...

  8. 手摸手教你在vue-cli里面使用vuex,以及vuex简介

    写在前面: 这篇文章是在vue-cli里面使用vuex的一个极简demo,附带一些vuex的简单介绍.有需要的朋友可以做一下参考,喜欢的可以点波赞,或者关注一下,希望可以帮到大家. 本文首发于我的个人 ...

  9. iOS开发 - 设立UIButton的Image为Aspect Fit

    Button setImage设置的图片默认是会拉伸缩放的,如果我想要Aspect Fit的效果,要如何做呢?一开始我想到了用contentMode属性,很可惜不起作用.后来我发现button有一个i ...

  10. 以正确的方式下载和配置 ASP.NET Core 官方源码

    我们可以在Github上面直接查看ASP.NET Core 3.x的源代码,但是我们也可以把源代码下载下来进行查看. 而下载源代码进行查看有很多好处: 任意的导航源代码 内置了一个示例项目 直接调试源 ...