自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不忘初心

方得始终

  • 博客(40)
  • 收藏
  • 关注

原创 POJ 3311 Hie with the Pie(状压DP)

题目链接:点击打开链接题意:从起点出发访问所有的点最后回到出发点,每个点可以多次经过,问最小时间花费。思路:由于每个点可以多次经过,所以可以考虑先用floyd算法求出最短路,然后进行状压DP,当前访问过的点压缩成二进制状态,每个位代表一个点,1表示访问过,0表示未访问过,dp[state][v],表示在state状态下,且最后一个访问到的点为v时的最小时间花费。由于起点编号为0,其他点从1

2017-08-30 21:20:47 406

原创 HDU 2196 Computer(树形DP)

题目链接:点击打开链接题意:求树上每个点到其他点的最长距离。思路:典型的树形DP,分析发现,当前节点的最大距离只有两种来源,一种是它到叶子节点的最大距离,一种是经过父亲节点的最大距离,不过,如果父亲节点的最大距离等于父亲节点经过当前节点的最大距离,方案是不可取的,即此处取的是父亲节点到叶子节点不经过当前点的最大距离 + 到当前点的距离,因为要求不经过当前点,所以我们求当前节点到叶子节点

2017-08-28 21:53:50 383

原创 三种LCA算法(三):转化为LCA问题(dfs+ST表实现)

转化为RMQ问题也是比较常用的LCA算法之一,大多采用dfs+ST表实现,在线算法,复杂度为O(n + nlogn + Q),Q为查询次数。在线算法里,dfs+ST表算法比Doubly算法快。算法流程:1.对树进行dfs,将遍历到的节点按照顺序记下,将得到一个长度为2*n - 1的序列。2.每个节点都在序列中出现,我们记录节点u第一次在序列中出现的位置为first[u]。3.根据d

2017-08-25 14:10:06 949

原创 三种LCA算法(二):Tarjan算法

Tarjan算法也是一种常用的解决LCA问题的算法,算法复杂度低,O(n + Q),Q为查询次数,基于DFS+并查集,离线算法(首先读入所有的询问(求一次LCA叫做一次询问),然后在算法执行过程中完成所有查询,把查询结果存储起来,再去根据每次查询直接输出结果),离线算法局限性较大。算法思路:Tarjan算法也是基于DFS的,对于新搜索到的一个节点,首先创建由这个节点构成的集合,再对当前节点

2017-08-24 15:13:40 890

原创 三种LCA算法(一):Doubly算法(倍增算法)

LCA,最近公共祖先,实现有多种不同的方法,对于树上的问题有着广泛的应用,比如树上的最短路径。常用的解决LCA问题的算法有:Tarjan算法,Doubly/倍增算法,转化为RMQ问题等。本文介绍基于DFS+二分搜索的在线算法,Doubly/倍增算法。(此处二分不同于二分查找算法那种)算法初探:对于已知的一棵树(已编号),若记录点v到根的深度为depth[v]。那么,如果节点w是u和

2017-08-23 21:55:16 1439

原创 RMQ算法(一):ST表(Sparse Table)

#include #include #include #include #include #include using namespace std;int n;int a[100005], dp[10005][20], upper[100005];//以最小值为例;upp

2017-08-22 22:43:35 549

原创 POJ 3264 Balanced Lineup(ST表)

题目链接:点击打开链接裸的ST表,水题// POJ 3264 Balanced Lineup.cpp 运行/限制:3375ms/5000ms#include #include #include #include using namespace std;int n;int a[50005], minValue[50005][20], maxValue[50005][20], u

2017-08-22 21:29:19 346

原创 2017百度之星初赛(B) 1006 小小粉丝度度熊(尺取法)

题目链接:点击打开链接思路:先将区间处理成不相交区间,补签肯定是要选择相邻的空隙,这样才能使分散的天数连起来从而最大化签到天数,然后再考虑,具体要如何选择呢?DP?看不出状态转移;贪心?局部最优解规则不明显,优先选择签到天数多的或者优先选择空隙大的去补签都不正确;这样看,此题该采用枚举之类的做法?难道暴力枚举被选择空隙的范围?肯定不可以,这样复杂度达到了O(n ^ 2),会超时;其实这里枚举空

2017-08-15 22:31:47 564

原创 2017百度之星初赛(B) 1002 Factory(倍增法求LCA)

题目链接:点击打开链接思路:树形图上的最短距离,很容易想到LCA算法,树形图上的两个节点的最短距离是唯一的、确定的,是两个节点到其最近公共祖先的距离之和。直接枚举两个分公司的办公室,两两算出最短路径,取最小值即为结果。具体利用LCA求出最短距离的方法是,先预处理,深搜一遍树形图,得到每个节点距离树根的距离,则最短距离为dist[x] + dist[y] - 2 * dist[ lca(

2017-08-15 20:46:01 460

原创 求组合数

一:由公式直接求组合数,C(n,m)= n!/ (m! * (n - m)!),预处理打阶乘表n!限制了n的范围为n #define LL long longLL f[21];void init() { f[0] = 1; for (int i = 1; i <= 20; i++) { f[i] = f[i - 1] * i; }}LL C(int n, int m) {

2017-08-15 20:06:33 872 1

原创 2017百度之星初赛(B) 1001 Chess(找规律+递推求组合数)

题目链接:点击打开链接思路:看到这个题呢,开始想的复杂了,可能受八皇后思维的影响,光想着怎么改进八皇后的算法,利用搜索去解题,此题的棋盘规模大,利用搜索和八皇后的思维肯定超时,而且一开始对题意有疑问,“摆最多个数的車“,何为最多个数?最后想不起来怎么修改算法,就去考虑,会不会是递推题或者分治题或者规律题?仔细一想,还真有规律可求,最多个数,就是这个棋盘最多放多少車,求在棋盘放这个数量車的方案数

2017-08-15 13:38:34 515

原创 2017百度之星初赛(A) 1006 度度熊的01世界(搜索连通块)

题目链接:点击打开链接思路:一开始看上去难以入手,大胆的暴力bfs/dfs即可,按照题意来,不要想多。题目对图像的定义是,图像0的定义:存在1字符且1字符只能是由一个连通块组成,存在且仅存在一个由0字符组成的连通块完全被1所包围;图像1的定义:存在1字符且1字符只能是由一个连通块组成,不存在任何0字符组成的连通块被1所完全包围。那就按照定义搜索一遍图像同时对不同连通块计数。cnt0表示不被1包

2017-08-15 13:10:51 484

原创 2017百度之星资格赛(A)1005 今夕何夕(日期计算)

题目链接:点击打开链接题目中文,不再详述题意思路:简单的日期计算,基础题。自己这个写法分类讨论多一些,细节多,偏于繁琐,容易出错,听人讨论说,有比较简洁的算法,感兴趣的小伙伴可以上网搜一搜。// 今夕何夕.cpp 运行/限制:15ms/1000ms#include #include #include using namespace std;int month[2][13] =

2017-08-15 12:46:22 592

原创 2017百度之星初赛(A)1001 小C的倍数问题(求因子数)

题目链接:点击打开链接题目中文,题意不再详述思路:当p = 10,满足条件的B有1、3、9,可以看出为9的因子,类比可得出其他进制的规律,p进制满足条件的B为p  - 1的因子。(数论不好,具体咋证明不知道,自己遇到这种题,基本就是凭经验乱搞......)求一个数的因子数的方法很多:最暴力的就是枚举,数据范围1e9,此办法排除;求出质因子的分解再去确定因子数,因为要进行素数打表预处理,

2017-08-15 11:14:42 554

原创 LightOJ 1056 Olympics(数学公式)

题目链接:点击打开链接题意:跑道,直跑道和弧形跑道的全长400米,两个弧在同一个圆上,直跑道和弧形跑道对应的宽的比为a:b,求出长、宽的具体值?思路:简单的数学公式即可,由图:角r = atan(a / b),r为弧度制又2 * R * (PI - 2 * r) + 4 * R * cos(PI / 2 - r)= 400,即R * (PI - 2 * r)+ 2 * R

2017-08-11 19:54:11 459

原创 LightOJ 1048 Conquering Keokradong(二分+贪心)

题目链接:点击打开链接题意:给出n,k,然后给出n + 1个数,把这n + 1个数组合成k + 1组,组内、组间必须是连续的,问怎么组合,最大 组内和 取最小?而且组合时,第一组组内和要尽可能的大,第二组组内和再尽可能的大,以此类推......思路:由题意,n >= k,所以n + 1个数,组合成k + 1组是一定有解的,这点不用做特殊判断。在此基础上,再考虑前面组的组内值尽可能的大,那么

2017-08-11 11:16:10 401

原创 LightOJ 1043 Triangle Partitioning(数学公式)

题目链接:点击打开链接简单的数学公式题,相似三角形面积比为边长比的平方,套公式即可。// LightOJ 1043 Triangle Partitioning.cpp 0ms/500ms#include #include #include #include #include using namespace std;int main(){ int t, cases = 0;

2017-08-11 08:32:13 429

转载 贪心

转自:点击打开链接 感谢博主!一、基本概念:贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所求出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与

2017-08-10 20:27:11 419

原创 HDU 1045 Fire Net(搜索/贪心/二分图最大匹配)

题目链接:点击打开链接题意:类似于八皇后问题,每行每列不能产生冲突,但此题图中有墙,两个碉堡如果隔了墙是可以放到同一行/列的。思路:一:搜索,由于数据规模很小,搜索是最直接的方式二:贪心,每个空地都有一个影响范围,一旦某块空地放置了碉堡,那么它的影响范围内所有空地都不能放碉堡了。贪心规则:每次选取影响范围最小的空地放置碉堡,然后就把这个空地影响范围内所有空地标记,按这种方法最后放置

2017-08-10 20:18:23 465

转载 动态规划

转载自:点击打开链接 感谢博主!一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求

2017-08-10 10:45:18 315

原创 HDU 1009 FatMouse' Trade(贪心)

题目链接:点击打开链接题意:一共有n个房间,每个房间里有一定数量的JavaBeans,每个房间里的JavaBeans价格不一样,而且每个房间的JavaBeans可以购买任意数量。FatMouse有m元,最多可以买多少JavaBeans?思路:贪心水题......求出单价,按照单价递减排序,再逐个处理。// HDU 1009 FatMouse' Trade.cpp 运行/限制:31ms/

2017-08-09 22:49:56 329

原创 HDU 4734 F(x)(数位DP)

题目链接:点击打开链接题意:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,Ai是十进制数位,给出a、b,求区间[0,b]内满足f(i)=f(a)的i的个数。思路:数位DP,dp[pos][sum]表示在!limit情况下,第pos个位置及其以后的数位的f(x)值为sum的情况有多少种。每组测试数据,先算出f(a),

2017-08-08 20:39:56 348

原创 HDU 2089 不要62(数位DP)

题目链接:点击打开链接题意:中文题目,很显然思路:数位DP入门,DP函数有四个参量,当前位置,前一位的数字,前一位是否为6,前几位取值是否都是上限。dp[i][state]表示第i位在limit(limit对应第四个参量)取0时,该state状态下(state对应第三个参量)剩余位数(包括本位)取值满足条件的方案和。// HDU 2089 不要62.cpp 运行/限制:0ms/1000

2017-08-08 11:01:18 298

原创 POJ 2362 Square(搜索+剪枝)

题目链接:点击打开链接题意:给定一些木棍,是否能拼成正方形(木棍不能折断)?思路:搜索,由题意,木棍要分别能组成四个边,不多不少。读取完数据,所有木棍的长度和要能整除4,而且最长的木棍不能超过边的长度,先做这俩处理再搜索,能节省时间。搜索时,顺序搜索每一条的组成情况,需要注意的是,为了不重复搜索,当前边选择木棍时,下一个处理的木棍的下标要比当前的大,而不能从最小的下标再开始选择,即

2017-08-07 21:33:46 666

原创 HDU 1078 FatMouse and Cheese(记忆化搜索)

题目链接:点击打开链接题意:n * n的地图,每个位置有若干奶酪,FatMouse初始位置在原点,每次可以跑向上下左右四个方向,距离原位置不超过k,而且下一个位置要比之前的位置的奶酪要多,到达一个位置就吃光该位置的奶酪,该过程直到FatMouse不能再移动为止,问FatMouse最多能吃多少奶酪?思路:记忆化搜索,dp[i][j]表示在(i,j)位置出发,最多能吃的奶酪数;由于FatMou

2017-08-07 16:34:51 351

原创 2017百度之星资格赛 1004 度度熊的午饭时光(01背包)

题目链接:点击打开链接题意就是 用尽可能多的钱(在预算内),买 得分和 尽可能高的饭(不重样),同时饭的 序号和 尽可能小,序号和一样小的取 字典序 小的方案。用01背包做的,dp[i][j]表示前i个菜品中,花费j元所能购买(正好购买!!!j不能有剩余)的菜品的最高得分和,因为题目有序号和打印具体选择的要求,引入sum[i][j],pre[i][j],sum[i][j]表示在满足最高得分

2017-08-07 00:27:45 560

原创 2017百度之星资格赛 1003 度度熊与邪恶大魔王(DP)

题目链接:点击打开链接题目中文,容易理解,不再叙述思路:开始想到的是完全背包,对于每个怪兽,分别去利用完全背包得到最后DP结果,可是怪兽数量(取值1~10^5)太大,复杂度达到O(10^9),所以一定会超时,而且思路不是最佳的正确的解法就是普通的DP,dp[i][t]表示防御力为i(取值0~10),生命值为t(取值1~1000)的怪兽被打败需要的最小晶石数,再加入j(取值1~100

2017-08-07 00:26:51 698

原创 2017百度之星资格赛 1002 度度熊的王国战略(并查集 or 无向图最小割)

题目链接:点击打开链接题意很容易理解,基本上这个题意就是让你去考虑无向图的最小割,无奈只会用模版,还没想好怎么用堆优化Stoer-Wagner算法,TLE......而且百度把这题的时间放宽到了2000ms,这样还超时,不会优化真尴尬......SW算法用堆优化一般适用于稀疏图,如果是稠密图,优化还可能更费时,看此题的数据,点的个数取值为3 * 10^3,边的个数为10^5,应该是稀疏图的测试

2017-08-07 00:25:39 1032

原创 POJ 1579 Function Run Fun(记忆化搜索)

题目链接:点击打开链接题意很简单,记忆化搜索的水题......// POJ 1579 Function Run Fun.cpp#include #include #include #include using namespace std;int dp[25][25][25];int dfs(int a, int b, int c) { if (a <= 0 || b <=

2017-08-05 11:34:07 331

原创 POJ 3279 Fliptile(普通搜索)

题目链接:点击打开链接题意:给出m行、n列的棋盘,每一个格子只有两种状态0或1,每次可以选择一个格子执行翻转操作,并且与该格子相邻的4个格子都会被翻转,求将所有格子都翻转成0所需要的最小操作数,若有多种翻转方法,输出字典序最小的方案。思路:看到题目首先想到的为搜索,这题和之前做的求棋盘翻转到目标状态需要的最小次数的题很类似,可是这题让给出具体的翻转序列,这样就不能根据广搜只考虑状态变化了,

2017-08-04 23:52:37 336

原创 POJ 2955 Brackets(区间DP)

题目链接:点击打开链接题意:最大括号匹配,区间DP经典入门题目dp[i][j]表示从i到j的最大匹配数,遍历i,j的合法组合,若s[i] == s[j],先令dp[i][j] = dp[i + 1][j - 1],再去枚举i,j之间的位置t,利用dp[i][j] = max(dp[i][j], dp[i][t] + dp[t + 1][j])更新dp[i][j]。// POJ 2955

2017-08-04 20:08:56 341

原创 LightOJ 1422 Halloween Costumes(区间DP)

题目链接:点击打开链接题意:按题目序号顺序参加舞会,每个舞会对衣服都有要求,身上可以套好多件衣服,需要时候就脱下来,但脱下来之后,这件衣服就不能再用了,最少需要几件衣服?思路:区间DP,dp[i][j]表示从i到j舞会最少需要的衣服,边界DP[i][i] = 1;对于区间i,j,若a[i] = a[j],则j舞会直接穿i的衣服即可,先令dp[i][j] = dp[i][j -

2017-08-04 19:05:44 330

原创 POJ 1185 炮兵阵地(状压DP)

题目链接:点击打开链接思路:很容易想到把地图转化为0 1矩阵,从而对每行再用到状态压缩,山用1表示,空地用0表示,即把地图也用状态压缩的方式存起来,便于以后处理。开始先根据一行中每个炮的影响范围为左右各两个距离,枚举出对于行来说,满足要求的排放状态。然后枚举每行的状态时,先判断此状态和原始地图的二进制表示冲不冲突,因为用1代表的H(山地),加上只能空地放炮,所以把状态和本行二进

2017-08-03 22:56:36 327

原创 POJ 3254 Corn Fields(状压DP)

题目链接:点击打开链接题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法。对于0-1状态矩阵,自然而然会想到用状态压缩来做,把一行的状态压缩成一个十进制数。根据题目所说不能挨着种植,即这一行的某个位置种植了,下一行的同一位置就不能种植,可以知道两行的种植状态相位与要为0。另外一行中相邻的格子是不能同时种植的

2017-08-03 13:29:45 323

原创 POJ 3342 Party at Hali-Bula(树形DP)

题目链接:点击打开链接题意:给定一个树,选择若干节点,使得选择的结点中任一结点不会和它的子结点同时被选择,求能选节点的最大数量,并且统计选择方案是否唯一。之前做过这个题,只不过没加入唯一性判断。唯一性判断的方法也基于动态规划思想,开个二维数组,flag[v][2],用于标记选择或者不选择当前节点时,最大数量方法的唯一性,唯一性由后继节点决定。对于flag[fa][1],由于dp[fa]

2017-08-03 00:13:03 348

原创 HDU 1087 Super Jumping! Jumping! Jumping!(基础DP)

题目链接:点击打开链接题意:求最大公共子序列和// HDU 1087 Super Jumping! Jumping! Jumping!.cpp 运行/限制:31ms/1000ms#include #include #include #include using namespace std;int main(){ int n, re, a[1005], dp[1005]; w

2017-08-02 21:21:18 304

原创 ZOJ 3201 Tree of Tree(树形DP+背包)

题目链接:点击打开链接题意:给一棵节点带权树,找到一个有k个节点的子树,这个子树的有最大权值思路:树形dp+背包。dp[i][j]表示以i为根节点且有j个节点的子树的最大权值,对i的每个子节点做分组背包,选择适合数量的节点分配给它。dp[i][j] = max{ max{dp[i][j-t] + dp[v][t] | 1<=t<j} | v是i的儿子节点},ans = ma

2017-08-02 09:12:08 497

原创 ZOJ 1134 Strategic Game(树形DP)

题目链接:点击打开链接题意:一个树形图,在节点上安排士兵,每个士兵能看到与这个节点相连的边,问最少安排多少士兵能看到所有的边很显然是树形DP,二维数组dp[i][2],dp[i][0]是以当前节点为根的子树,在树根不放士兵的情况下该子树最少安排的士兵;dp[i][1]是以当前节点为根的子树,在树根放士兵的情况下该子树最少安排的士兵// ZOJ 1134 Strategic Game.c

2017-08-01 22:31:55 308

原创 HDU 1542 Atlantis(矩形面积并,线段树+离散化+线扫描)

题目链接:点击打开链接题意:矩形面积并思路:由于数据较大,浮点数先要离散化;然后把矩形分成两类边,上边和下边,相关信息存到结构体中;对离散化后的横轴建线段树,然后对于每条边,自下而上扫描上去,每次扫描到的块为当前边与下一条边之间的块,sum代表区间内被覆盖的线段的长度总和,那么sum[1]就表示当前块 线段(横轴)的总长度,每次处理用sum[1] * 当前块height就是该块面积;这

2017-08-01 17:45:02 383

原创 POJ 3667 Hotel(线段树区间合并查询)

题目链接:点击打开链接题意:1 a:询问是否有连续长度为a的空房间,有的话选最左边2 a b:将[a,a+b-1]区间的房间清空思路:这类题目会询问区间中满足条件的连续最长区间,所以pushUp的时候需要对左右儿子的区间进行合并;用lsum,rsum,msum三个数组记录区间中最长的空房间// POJ 3667 Hotel.cpp 运行/限制:1079ms/3000ms#in

2017-08-01 12:04:28 302

空空如也

空空如也

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

TA关注的人

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