自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 洛谷P1387 最大正方形【DP】

题目链接:P1387 最大正方形程序说明:参考了Ice_teapoy大佬的题解 第一个题解。f[i][j]表示a[i][j]左上角的最大正方形边长。f[i][j] 由 f[i - 1][j],f[i][j - 1],f[i - 1][j - 1] 三者的最小值转移过来。为什么是最小值?因为比最小值大的话就一定包含0了。三者取最小可以用两个min函数。代码如下:#include <i...

2020-02-27 21:39:13 182

原创 洛谷P1020 导弹拦截【LIS 贪心+二分】

题目链接:P1020 导弹拦截程序说明:第一个问题是求最长非上升子序列。upper_bound和lower_bound只能对非递减序列进行查找,由题可知 f 数组是单调递减的,因此需要在upper_bound函数中多一个参数:greater()或者手写cmp。第二个问题是求最长上升子序列(Dilworth定理),证明的方法可以参考大佬的博客:DP-导弹拦截。即最长上升子序列和最大非上升子序...

2020-02-26 21:31:43 288

原创 没有上司的舞会【树形DP】

题目链接:285. 没有上司的舞会Ural大学有N名职员,编号为1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数...

2020-02-26 18:22:09 176

原创 洛谷P1091 合唱队形【线性DP】

题目链接:P1091 合唱队形程序说明:f[i]表示 i 左侧的最长上升子序列,g[i]表示 i 右侧的最长上升子序列。合唱队形的总人数为 f[i] + g[i] - 1。总人数减去合唱队形人数的最大值,就是出列的同学的最小值。代码如下:#include <iostream>using namespace std;const int N = 110;int a[N],...

2020-02-25 22:15:10 180

原创 最短Hamilton路径【状态压缩DP】

题目链接:91. 最短Hamilton路径 给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。输入格式第一行输入整数n接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(记为a[i,j])。对于任意的x,y,z,数据保证 a[x,x]...

2020-02-25 09:23:39 231

原创 蒙德里安的梦想【状态压缩DP】

题目链接:291. 蒙德里安的梦想 求把NM的棋盘分割成若干个12的的长方形,有多少种方案。例如当N=2,M=4时,共有5种方案。当N=2,M=3时,共有3种方案。如下图所示:(图在链接里.)输入格式输入包含多组测试用例。每组测试用例占一行,包含两个整数N和M。当输入用例N=0,M=0时,表示输入终止,且该用例无需处理。输出格式每个测试用例输出一个结果,每个结果占一行。数据范围...

2020-02-24 16:56:39 336

原创 整数划分【DP】

题目链接:900. 整数划分一个正整数n可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中n1≥n2≥…≥nk,k≥1。我们将这样的一种表示称为正整数n的一种划分。现在给定一个正整数n,请你求出n共有多少种不同的划分方法。输入格式共一行,包含一个整数n。输出格式共一行,包含一个整数,表示总划分数量。由于答案可能很大,输出结果请对10910^9109+7取模。数据范...

2020-02-23 19:21:41 923

原创 洛谷P2758 编辑距离【线性DP】

题目链接:P2758 编辑距离程序说明:dp[i][j]表示前a的前 i 个字母和b的前 j 个字母匹配所需要的最少的操作次数,转移方程可以分为三种情况:删除:a的前 i - 1 个字母和b和前 j 个字母匹配,然后删掉a的第 i 个字母。即dp[i - 1][j] + 1。增添:a的前 i 个字母和b和前 j - 1 个字母匹配,然后把 b[j] 增添到 a[i] 的后面去。即dp[i...

2020-02-20 10:01:02 232

原创 洛谷P1880 [NOI1995]石子合并【区间DP】

题目链接:P1880 [NOI1995]石子合并程序说明:这道题和P1090 合并果子有些类似,但合并果子的过程是构造一棵哈夫曼树,而这道题是只能合并相邻的石子,通过模拟可以证明贪心得到的答案是错的,因此用动态规划来做。设dp[l][r]表示从 l 到 r 区间合并石子的代价的最小值,用k来划分区间,每次合并都终归于把 l 到 k - 1 和 k 到 r 两个子区间合并,然后加上区间的和(...

2020-02-19 12:30:17 255 1

原创 最长公共子序列【线性DP】

题目链接:897. 最长公共子序列 给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。输入格式第一行包含两个整数N和M。第二行包含一个长度为N的字符串,表示字符串A。第三行包含一个长度为M的字符串,表示字符串B。字符串均由小写字母构成。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000输入样例:4 5acbdabed...

2020-02-18 10:42:07 463

原创 洛谷P1115 最大子段和【线性DP】

题目链接:P1115 最大子段和程序说明:设dp[i]表示以第 i 个数结尾的最大字段和。根据递推式 dp[i] = max(a[i], dp[i - 1] + a[i]),说白了就是如果加上前一个数反而变小的话,就把前面的数都扔掉。注意边界问题,因为第一个数如果是负数的话,有可能dp的起始值会被更新成0。。因此一定要注意dp起始值的初始化,然后从第二个数开始遍历。代码如下:#incl...

2020-02-17 22:07:58 216

原创 洛谷P1049 装箱问题【01背包】

题目链接:P1049 装箱问题程序说明:令价值和体积相等就变成01背包问题了。代码如下:#include <iostream>using namespace std;const int N = 20010;int v[N], dp[N], n, m;int main() { cin>>m>>n; for(int i = 1; i &lt...

2020-02-17 18:07:44 231

原创 最长上升子序列【线性DP】【贪心+二分】

题目链接:896. 最长上升子序列 II给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤100000−109≤数列中的数≤109输入样例:73 1 2 1 8 5 6输出样例:4程序说明:动态规划时间复杂度O(n2n^2n2)dp[...

2020-02-17 13:43:55 494

原创 数字三角形【线性DP】

题目链接:P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles程序说明:第一种做法是从上往下递推,每个点可以从左上角或者右上角得到,思路简单但是注意边界问题,即考虑到最右侧的点也会从右上角得到,因此初始化时内层循环是1 ~ i + 1。最后遍历最后一层找到最大的数即为答案。第二种做法是从下往上递推,将每个数更新成左下方和右下方的数取较大者,再加上原...

2020-02-17 09:34:51 227 3

原创 洛谷P1346 电车【最短路】

题目链接:P1346 电车程序说明难点是建图,把每个路口看成一个顶点,每个顶点的第一条边权值设为0,其余边权值设为1,然后求出最短路就行了。由于顶点数n的范围小,可以用Floyd算法来做。代码如下:#include <iostream>#include <cstring>using namespace std; const int N = 1100;i...

2020-02-14 21:06:14 169

原创 洛谷P1265 公路修建【最小生成树】

题目链接:P1265 公路修建程序说明:根据题意可知是最小生成树问题。输入的是顶点的坐标,需要计算出所有的点之间的距离。kruskal算法需要对所有的边按照权值排序,空间代价会很大,因此用prim算法来做。用邻接矩阵存图会MLE,而prim算法在更新点到集合的距离时才会用到边长,因此不需要开二维数组,用一个结构体数组保存坐标就可以了。更新距离的时候可以直接由点坐标计算出距离。还有一点要注...

2020-02-14 11:29:53 219

原创 洛谷P2330 [SCOI2005]繁忙的都市【最小生成树】

题目链接:P2330 [SCOI2005]繁忙的都市程序说明:题目中的条件明显能看出来是最小生成树吧(太明显了),最后要求的是最小生成树里权值最大的边。prim和kruskal都能做,kruskal做这道题简直不要太简单。代码如下:#include <iostream>#include <algorithm>using namespace std;cons...

2020-02-14 07:26:50 228

原创 洛谷P1141 01迷宫【记忆化搜索】

题目链接:P1141 01迷宫程序说明:可以用bfs来做,但是数据毒瘤,如果每次询问都运行一次bfs,会有三个TLE。。可以将路途经过的点储存起来并且记录答案,如果询问的点已经被记录了答案,直接输出答案就行了,这里是用一个队列存经过的点。d数组用于标记是否能走到,注意每次bfs不需要更新d数组。代码如下:#include <iostream>#include <que...

2020-02-12 13:34:21 343

原创 POJ1321 棋盘问题【DFS】

题目链接:棋盘问题Description在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。Input输入含有多组测试数据。每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n ...

2020-02-11 20:16:52 145

原创 洛谷P1706 全排列问题【DFS】

题目链接:P1706 全排列问题#include <iostream>#include <cstdio>using namespace std;const int N = 10;int path[N], vis[N], n;void print() { for(int i = 1; i <= n; i++) printf("%5d", path...

2020-02-08 18:56:31 253

原创 洛谷P1824 进击的奶牛【二分答案】

题目链接:P1824 进击的奶牛程序说明:最大值最小化问题。明显能看出答案是在一个单调区间内的,因此用二分法来解。二分的难度主要是check函数的构造。代码如下:#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int N = 10...

2020-02-07 20:18:59 1433

原创 HDU4825 Xor Sum 最大异或对【字典树】

题目链接:Xor SumProblem DescriptionZeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整数 S ,之后 Zeus 需要在集合当中找出一个正整数 K ,使得 K 与 S 的异或结果最大。Prometheus 为了让 Zeus...

2020-02-07 18:30:20 269

原创 洛谷P1147 连续自然数和 【二分+前缀和】

题目链接:P1147 连续自然数和程序说明:求出前缀和然后暴力枚举会超时,因此考虑二分答案,即寻找满足 s[j] - s[i - 1] = n 的 j 。代码如下:#include <iostream>#include <cstdio>using namespace std;const int N = 2000010;long long s[N];int...

2020-02-06 14:20:53 399

原创 数组元素的目标和【双指针】

题目链接:数组元素的目标和给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。请你求出满足A[i] + B[j] = x的数对(i, j)。数据保证有唯一解。输入格式第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。第二行包含n个整数,表示数组A。第三行包含m个整数,表示数组B。输出格式共一行,包含两个整数 i 和 j。数据范围数组长度不...

2020-02-06 11:20:19 346

原创 洛谷P2580 于是他错误的点名开始了【字典树】

题目链接:P2580 于是他错误的点名开始了程序说明:cnt 数组存储某字符串出现的次数。每次查询完后做标记,下一次再查到的时候输出REPEAT。大概是用getline读字符串处理不好回车的输入,卡了很久(输出是正确的但是全WA。。:) 还是用scanf输入吧不会出错。。。代码如下:#include <iostream>#include <cstdio>usi...

2020-02-05 21:49:40 274

原创 HDU2519 新生晚会【组合数】

题目链接:新生晚会Problem Description开学了,杭电又迎来了好多新生。ACMer想为新生准备一个节目。来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法?Input数据的第一行包括一个正整数T,接下来有T组数据,每组数据占一行。每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M&...

2020-02-04 17:41:16 196

原创 HDU4509 湫湫系列故事——减肥记II【模拟+枚举】

题目链接:湫湫系列故事——减肥记II虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动!于是,结果显而易见…  但是没有什么能难倒高智商美女湫湫的,她决定另寻对策——吃没关系,咱吃进去再运动运动消耗掉不就好了?  湫湫在内心咆哮:“我真是天才啊(≧▽≦)/”可是,大家要知道,过年回家多忙啊——帮忙家里做大扫除,看电影,看小说,高中同学聚餐,初中同学聚餐,小学同学聚餐...

2020-02-04 13:48:33 252

原创 HDU1205 吃糖果

题目链接:吃糖果Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 58674 Accepted Submission(s): 16785Problem DescriptionHOHO,终于从Speakless手上赢走了所有的糖果...

2020-02-04 10:40:30 153

原创 洛谷P1908 逆序对【归并排序】

题目链接:P1908 逆序对程序说明:归并排序的原理是先分治后合并,分治之后的结果是每个子序列有序,然后依次将两个子序列合并。因为每个子序列都有序,所以不可能出现逆序对。归并排序默认从小到大排,那么当每两个子序列进行合并操作时,如果位于前面的子序列中的某一个数大于后面子序列中的某数时,则出现了逆序对。设i是指向前一个子序列的指针,j是指向后一个子序列的指针,则当出现逆序对时,一定有a[i]...

2020-02-02 09:12:41 325

原创 洛谷P1182 数列分段 Section II【贪心+二分】

题目链接:P1182 数列分段 Section II程序说明:二分适用于区间有界且单调,例如最大值最小或者最小值最大这类问题。设区间所有数中的最大值为L,区间所有的数总和为R,则答案一定位于L和R之间。利用二分算法快速得出答案。check函数利用贪心的思想,即P1181 数列分段Section I的方法,判断mid是否满足题目要求,如果不满足则在相应的区间进行二分查找。代码如下:#in...

2020-02-01 13:53:30 363

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除