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

题目链接:https://www.luogu.com.cn/problem/P1514 题意大致是:给定一个(n,m)的数值矩阵,可以在第一行建造水库,如果一个格子周围的某格子值小于它,那水就可以流到它周围的那个格子,问需要在第一行建造多少水库使得最后一行能够被完全覆盖,如果不能完全覆盖就求出不能覆盖的格子的数量. 主要思路就是在第一行每个点出发的水能到达第n行的区间可以获得(可以用反证法证明每个点出发的水如果能到达第n行那么它的覆盖区间一定是连续的),如果能够完全覆盖第n行则用最小区间数覆盖可…
题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA  因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 我们定一个f[u][k]数组为从当前节点u还剩时间k到达终点的方案 原来从u走到终点的最短路径消耗时间为dis[u] 而我们现在考虑走(u,v,w)这条边(不是最短路) 那么比走最短路需要多dis[v]+w-dis[u]的时间 所以f[u][k]=∑f[v][k-(dis[v]+w-dis[u])]…
我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先假设中间有一个格x隔开了两个能到的区间,那x一定比那两个区间的端点高,但它又是可达的,那一定有一条路径,每一个格都比x高,从底部到最上面贯穿 那我们刚才的那个起点一定在这个路径的一侧,它能到的区间位于这个路径的两侧,又因为它不能到达x,所以一定不能穿过这条路径,所以就不能到位于另一侧的去见了) 这样…
---题面--- 题解: 本蒟蒻并没有想到bfs的做法,,,, 只会dfs了 首先我们需要知道一个性质. 我们设k[i].l 为在i点建立水库可以支援到的最左边的城市,k[i].r为最右边的. 那么点i可以支援到的城市必然有且仅有k[i].l ~ k[i].r这整个区间. 这是为什么呢? 其实我也不会证明,但是可以大致说明一下,也不知道是否严谨.... 观察上图我们可以发现,假设我们可以到达 l 和 r ,却无法到达中间那个,那么说明mid要高于 l 和 r, 通过观察我随意画的几组路线可以发现…
题意 题目链接 求出把$n$分解为斐波那契数的方案数,方案两两不同的定义是分解出来的数不完全相同 Sol 这种题,直接爆搜啊... 打表后不难发现$<=1e18$的fib数只有88个 最先想到的应该是直接把$n$加入到搜索状态里,然后枚举能被分成哪些 但是这样分解出来的数可能会有重复的,因此我们还要把当前考虑到第几个数也加入到状态里. 不难得到以下代码 但是很显然会T飞. 优化一下,只考虑当前的fib数对答案的贡献, 也就是搜两种情况: 1.用该数分解 2.不用该数分解 代码是这样的 然而还是会…
洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG 所以先大力dfs出每个点的区间. dfs之后可以先check一下 无解就暴力乱搞 有解时贪心,最开始右端点为0,每次选择可以与右端点相连接的区间中右端点最右的(语文不好),加入进答案并且更新右端点直到覆盖全区间. 我什么时候才能1A一道noip题... // It is made by XZZ #i…
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根节点的最大匹配&方案数,$g[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配不选择根节点的最大匹配&方案数.那么这是一个很普通的树形dp. 注意到区间长度相等的线段树的结果是一样的,且每层至多有两种区间长度不同的区间(参考 这题 ),因此直接以区间长度为状态进行记忆化搜索即可. 这…
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先因为聪聪的步数大于可可,所以不可能出现循环,因此是DAG上的期望DP,用记忆化搜索解决. 每个点bfs预处理p[x][y]表示x走向y的第一步位置,设f[x][y]表示聪聪在x可可在y追上的期望时间. $$f(x,y)=\sum_{z}\frac{f(g[g[i][j]]][j],z)}{out[x]+1…
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中序的特征,想到以枚举根结点为起点 那么轻易得出如果根结点的编号为x,那么左子树的结点有1~x-1,右子树 结点有x+1~n #include<iostream> #include<cstdio> #include<cstring> using namespace std;…
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1.5,1 是同一种分法. Input 第一行是測试数据的数目t(0 <= t <= 20). 下面每行均包括二个整数M和N,以空格分开.1<=M,N<=10. Output 对输入的每组数据M和N.用一行输出对应的K. Sample Input 1 7 3 Sample Output…
题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若和答案(自己拟定)相差小于等于1时,证说明已经能区分了,回溯.否则还要加问题再询问 */ /************************************************ * Author :Running_Time * Created Time :2015-8-13 10:54:…
ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索 [Problem Description] 给你一串\(01\)字符串,将其划分,使得划分后,分别求出每组\(01\)之和后是回文的,求划分的方案数, [Solution] 定义\(dp[l][r]\)表示,区间\([l,r]\)中满足条件的方案数是多少.…
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四个方向进行搜索,即可得到当前状态的最优解. #include <iostream> #include <cstdio> using namespace std; ][]; ][]; ]= {{,},{,-},{,},{-,}}; int r,c; int dpac(int i,int…
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 NN 行 \times M×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施.水利设施有两种,分别为蓄水厂和输水站.蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中. 因此,只有与湖泊毗邻的第 11 行的城市可以建造蓄水厂.而输水站的功能则是通过输水管线…
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从题中可以得出,要在N处的分数为K,那么那些到达N的路径上的节点的val必然是K的因子,由于K的范围为[1, 1000000],二维数组开不下,那么我们可以用一个数组来保留K的所有因子,在用一个数组来保留这个因子的值,这样,二维数组就可开了,于是,就是记忆化搜索了! /****************…
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文子串,然后记忆化搜索(判断是否是回文子串的时候也用一个数组来记录是否是回文子串,记忆化搜索). #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using nam…
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 << m) - 1则是可能的.打印与之前相似. #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 25 + 5; const int NODE = 10 * 10 + 5;…
一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1 例如: f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4 给定 l, r, k,求在 [l, r] 区间中,所有 f(x) = k 的 x 的和,…
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25887 题目大意:给定的一个某进制下的排列,问它的全排列有多少个能够整除给定的十进制下的数字k. 思路:记忆化搜索,dp[state][r]表示在某状态下被k除余数为r有多少个. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm>…
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25844 思路:首先预处理出点在同一直线上的所有的点集状态(dp[i][j]),然后记忆化搜索. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define inf 1<<…
题意:一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师.每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老师教而且使得总工资最少. 析:用两个集合来表示状态,s1表示恰好有一个人教的科目,s2表示至少有两个人能教的科目.d(i, s1, s2),表示已经考虑了前 i 个人的最少花费. 这里把所有的人和科目都要从0开始标号,记忆化搜索,对于第 i 个人我们是选还是不选进行求解最小的花费. 剩下的搜索就好.…
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1 比如: f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4 给定 输入 输入数据仅一行包括三个整数.l, r, k(0 ≤ l ≤ r ≤ 1018, |…
B Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 有n块地板排成一条直线,从左到右编号为1,2,3. . . n-1,n,每块地板上有一个权值w.如今要小B用这n块地板玩一个游戏. 小B能够选择随意一块地板作为起点,然后向右跳K次,每次最多能够跳5个格子(设起跳点地板编号为x,落地点为y,y-x <= 5).每踩在一块地板上,小B的得分sum += wi ,小B每次仅仅能踩一块地板,開始时sum = 0.如今请你编写一个…
题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了非常久也没有想出来,有点无从下手的感觉,最后还是尝试了一下记忆化搜索,以dp[0][0]为边界,dp[x][y]代表当前有x行y列没有彩色的 瓷砖,搜索起来思路还是非常清晰的,可惜最后那个 算期望公式给写错了,瞎了好久,做出以后看了一下别人的做法,确实有点难想到,把涂好的都放在右下角,这样就仅仅有四…
Cow Bowling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14210   Accepted: 9432 Description The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though, and line up in a standard…
2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測试数据太水了....10000*50*50*50都能过 加个vector优化到 #include "stdio.h" #include "string.h" #include "vector" using namespace std; double…
题意:给你一个长度为1000的串以及一个数n 让你将串中的‘?’填上数字 使得该串是n的倍数而且最小(没有前导零) 题解:dp,令dp[len][mod]为是否出现过 填到第len位,余数为mod 的状态(dp=0 or 1) 用记忆化搜索来实现,dfs返回1或0. 如果搜到最后一位并且余数为0,返回1. 如果搜到已经更新过的dp状态,直接返回0. 将mod作为全局变量,不断更新mod. 对于每一位 的‘? ’ 暴力枚举0~9 #include<stdio.h> #include<std…
http://poj.org/problem?id=3186   Description FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for giving vast amounts of milk. FJ sells one treat per day and wants to maximize the money he receives over a given period time…
题目链接 求最大的存活概率,DP+记忆化. 用f[s][x][y][hp]表示在s状态,(x,y)点,血量为hp时的存活概率. s是个三进制数,记录每个陷阱无害/有害/未知. 转移时比较容易,主要是在陷阱未知时需要知道当前状态这个陷阱为有害/无害的概率,并用这两个概率相加. 如何求某个状态下未知陷阱是否有害的概率呢(以下求有害概率,即 有害/(有害+无害)) DFS枚举每个陷阱已知有害/无害/未知的状态,我们需要处理未知陷阱在该状态下的概率. 枚举每个未知的陷阱,再枚举2^K的概率数组,只有当满…
题目大意:给你一个字符串,问你这个字符串的rank,如果这个字符串不合法,请直接输出0.(一个合法的字符串是对于∀i,有c[i]<c[i+1]) 字符串s的rank的计算方式:以字符串长度作为第一关键字,字符串大小作为第二关键字,将该字符串集排序,若从小到达数到的第k个字符串为s,则s的rank为k. 此题由于数据范围非常小(strlen(c)≤10),感觉暴力应该是可以AC的,不过我还是打了个数位dp. 此题直接记忆化搜索统计答案即可.不过要注意输入一个字符串时判断该字符串是否在该字符集内(我…