-----DP-----
文章平均质量分 60
KIJamesQi
这个作者很懒,什么都没留下…
展开
-
LightOJ 1057 Collecting Gold(状压DP)
题目 n∗m,(n,m)<(20,20)n*m,(n,m) < (20,20)的格子图上有一个人,和不超过15个的金矿;求这个人从当前位置出发获取所有金矿然后再回到这个位置需要走的最少路程?每次只能往邻近的四个方向走;思路 因为没有障碍物,所以算两个格子间的距离很方便; 开始用的穷举所有的获取金矿的先后顺序,然后TLE了; 最后就状压过了,dp[sta][i]表示达到状态sta原创 2017-02-14 15:25:21 · 505 阅读 · 0 评论 -
lightoj1086 Jogging Trails
有个无向网络,现在Robin想从某点出发,经历每条边至少一次,最后回到原点,求最少的权和。这个有点像是欧拉回路,其实就是的,只是呢,,,有的边会许会重复走。在欧拉回路中,点的度数必然是偶数,这题中的度数为奇数的点的偶数也必然是偶数个,因为这个是无向图。那么,图是连通的,所以最后我们需要将度数为奇数的点进行建边,其实就是这两点之间的最短路上的边再走一次。点只有15个,,,所以状压。dp[sta]原创 2015-12-08 19:49:35 · 430 阅读 · 0 评论 -
hdu5568 sequence2
思路:题目问的是长度为k的严格上升子序列有多少种。求种数的时候一般会想到大数,也就是简单模拟下加法运算。// #pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #includ原创 2015-11-30 11:53:34 · 318 阅读 · 0 评论 -
hdu5569 matrix
思路:dp[i][j]表示到这里的最小和。然后就是分奇偶讨论了。// #pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #includ原创 2015-11-30 12:23:06 · 550 阅读 · 0 评论 -
lightoj 1018 - Brush (IV)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1018题意分析:二分平面上有N个点,现在有一把可沿着任何方向走的刷子可以刷去这些点,问最少需要刷出多少条直线可以把点刷完?解题思路:这个是个比较典型的状压dp问题,首先N不大,可以用二进制表示每个点的状态,1表示还没有被刷掉,0表示被刷掉了。那么状态from中有num个1,如原创 2016-01-17 21:53:27 · 907 阅读 · 0 评论 -
lightoj 1017 - Brush (III)
而为坐标平面上给出n个点,问一把款w的刷子,横着刷k次最多能够刷掉多少个点。因为是横着刷,所以只考虑纵坐标。dp[i][k]表示前i个点刷k次最多能够刷的点数。。。然后就是枚举,不过要先处理完所有dp[i][1]的情况。。。开始想的是dp[i][j][k]表示区间[i,j]刷k次能够刷的最多点,,,但是转移出问题了。。。感觉无法转移状态。。。/*******************原创 2016-01-16 17:13:37 · 557 阅读 · 0 评论 -
lightoj 1013 - Love Calculator
先求个最长公共子序列的长度,dp1[i][j]表示装下X[1...i],Y[1...j]这两个串需要的最小长度。X[i] == Y[j],dp[i][j] = dp[i-1][j-1] + 1;X[i] != Y[j], dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + 1;然后就是dp2[i][j][k]表示X串的前i个和Y的前j个构成长度为k的串的原创 2016-01-16 14:13:54 · 334 阅读 · 0 评论 -
Dynamic Programming--Longest Common Subsequence
问题描述:给定两个序列:X[1...m],Y[1...n],求在两个序列中同时出现的最长序列的长度。(不必是连续的)穷举法:x中的子序列有2^m个。检查是否存在于Y中--O(n)。时间显然是不能接受的。。。动态规划:设C[i,j] = |LCS(X[1...i],Y[1...j])|,C[i,j]表示序列X[1...i],Y[1...j]的最长LCS,则C[m,n]就是最后的答原创 2016-01-16 13:57:10 · 349 阅读 · 0 评论 -
lightoj1219Mafia
对于某个节点u, 如果整个子树里的人数超过了节点数, 那么显然就要把多余的人移动到点u的父亲处, 而如果人不足, 就需要从u的父亲处拿人过来, 至于u父亲出人够不够, 那么就需要考虑以u的父亲为根的子树了, 所以可以考虑dfs递归处理问题, 对于所有节点, 如果节点上人太多, 多余的人必然要到他父亲那边, 如果没人,必要要从父亲处要人, 所以在每次处理完一颗子树时,根据子树的根的情况, 来修改子树原创 2015-11-25 23:06:15 · 350 阅读 · 0 评论 -
lightoj1085 All Possible Increasing Subsequences
思路:这题就是求这个序列中有多少个上升序列,如果按照一般的思路去for...for...for...的话,必然是超时的,所以这时候就需要减少时间上的复杂度,首先,dp[i] = ∑dp[k] (a[i] > a[k] && i > k),这样我们在往后面扫的时候需要快速的求出前面的和也就是等式右边的部分,这个当然就是线段树去完成了,由于单个数很大,只能离散化,还好n不大,离散化下来的话也就是n个数原创 2015-12-12 17:26:17 · 425 阅读 · 0 评论 -
lightoj1048 Conquering Keokradong
这是一个很不错的二分,,,可是wa了半天没做对,主要是二分最大单个区间的值,,,mid,当a[i] > mid的时候,low++,当cnt > k时,low++;cnt 然后就是打印比较容易挂掉;注意下就好了。// #pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include原创 2015-11-24 19:58:49 · 447 阅读 · 0 评论 -
hdu3848 CC On The Tree
思路:一棵树,叶子节点上有一个苹果,问CC从哪个非叶子节点出发获得两个苹果话的时间最少,速度one meter per second,给出两相连两点之间的距离。这个就是树形dp;dp[i][j]表示在第i号节点获取j个苹果的代价。dp[u][2] = min(dp[u][2], dp[u][1] + dp[v][1] + val);dp[u][1] = min(dp[u][1],d原创 2015-12-11 11:27:52 · 386 阅读 · 0 评论 -
uva1462(Fuzzy Google Suggest)
思路:建立字典树,然后dfs序列。这题的主要难度在于怎么dfs计数的问题,字典树就是次要的难度。如何表示是不变,增加,删除这三种状态?我们可以用一个指示性的指针来指向序列,用x来表示目前还可以增加删除的次数和。然后对于通过某种不变删除增加的组合形式最后到达的末节点表示为2,中间经过的节点表示为1。最后要注意的就是对于当前字符串搜索完之后要把vis数组清空。// #pragma comm原创 2015-10-30 01:19:13 · 402 阅读 · 0 评论 -
codeforces616D Longest k-Good Segment
滑动窗口,维护[l,r]。mp记录前面出现过的数的种数和每个数出现的次数。对于a[r]而言,能加入到当前的序列中的条件就是出现过或者是前面的种数小于k。否则就是l右移同时该数的数目减一,为0的话就种类减一。/*****************************************Author :Crazy_AC(JamesQi)Time :2015原创 2016-01-27 11:10:32 · 438 阅读 · 0 评论 -
poj1679 The Unique MST
先推荐下次下生成树的相关概念问题的描述。http://blog.csdn.net/jarily/article/details/8883858这个懂了次小生成树的解法就是判断次小是否等于最小。。。。。。。就是模版!/*****************************************Author :Crazy_AC(JamesQi)Time原创 2016-01-27 23:23:28 · 311 阅读 · 0 评论 -
hdu4081 Qin Shi Huang's National Road System
题目大意就是说,n个城市,修成一棵树,其中有一条边是可以用魔法的,这条边是不需要计费的,每个城市有住人,问修完所有的边的总路程是B,那条魔法修建边链接的两个城市的人口是A,求A/B的最大值。分析:一开始就能想到的是B小、A大。因为是修成树,所以B开始就直接是最小生成树的值了,同时记录两点路径上的最大边权。在就是枚举修建的魔法边,然后删掉两点间的最大边权值(前有做记录),这是直接算就是了,取最大原创 2016-01-29 14:06:30 · 366 阅读 · 0 评论 -
LightOJ 1061 N Queen Again(搜索+状压DP)
题目 给出一张8*8的图,上面有8个皇后,现在每次只能移动一个皇后往同一个方向走任意步,总共有8个方向;问最少需要多少步使得所有皇后相互不会攻击对方?思路 单纯的暴搜是不行的,时空都会炸。 假如我们知道最终每个皇后应该在的位置,然后再来计算最少步数就会简单不少,这里可以用状压来做; 因为最终的情况是每行有一个皇后,所以我没需要记录每行皇后所在的列,然后枚举哪个皇后移动到这个位置原创 2017-02-17 19:02:29 · 598 阅读 · 0 评论 -
lightoj1038 - Race to 1 Again(期望DP)
题意 给出一个1≤N≤1051 \leq N \leq 10^5,每次选其一个约数相除,知道得到结果为1为止,求期望次数;思路 期望dp,求x平均除多少次得到1;假设x有c个因子(含1和本身),E[x]表示结果; 那么E[x] = (E[1] + E[a1] + E[a2] + … + E[x] + c) / c;加c是因为每次要多走一步才能得到ai,每次选者的概率为1/c;原创 2017-02-05 23:41:25 · 326 阅读 · 0 评论 -
lightoj1037 状压DP(入门级)
题意 简单思路 dp[sta]表示状态为sta时需要打的最少次数,dp[0] = 0;/*****************************************Author :Crazy_AC(JamesQi)Time :2016File Name :*****************************************///原创 2017-02-05 23:29:20 · 364 阅读 · 0 评论 -
Gym 100543A Parades
题目链接 一颗有n个点的树,然后上面有m条关系链[u, v](就是u到v的路径),选出x条链,相互没有边重合,但是点是可以重合的。求x的最大值。 思路:树形dp+状压dp。 对于以u为根的子树,dp[u]表示这棵子树能有的最大x的值(也就是被选中的x条链满足题目条件且每条链的所有边都在子树中,不经过[fa, u])。 第一部分就是dp[u] = ∑dp[v] && v is a原创 2016-09-24 22:13:50 · 528 阅读 · 0 评论 -
CodeForces 547B (单调栈)
题意 一个有n个元素的序列,没连续l个元素的最小值为这个串的strength值,求所有连续l个元素的strength是的最大值。分析 a[i]如果是其所在串的strength值,那么必然它是最小值,往前和往后找小于它的第一个位置l、r,显然[l + 1, r + 1]区间的strength等于a[i]。 就可以更新长度为len(len = r - l + 1)的strength。还有原创 2016-08-17 17:18:36 · 580 阅读 · 0 评论 -
Gym 100851F Froggy Ford(dijkstra)
题意有条宽为w的河流,两岸分别在x = 0, x = w处,河中间有n个石板。在河的一岸有一只青蛙想通过石板跳到对岸去。现在可以在河中间某个位置多加一块石板,使得在单步跳跃中的最大值最小。思路Dijkstra变形,用两维来表示是否路径中使用过额外的石板。dis[0][u]表示没使用额外石板的最大最小,dis[1][u]表示使用额外石板的最大最小。然后就用Dijkstra格式进行转移了。/**原创 2016-08-15 21:35:54 · 904 阅读 · 0 评论 -
hdu3191 How Many Paths Are There(次短路计数dp)
次短路好算,这题多了个计数; dp[u][1],dis[u][1]分别表示到u最短的路径条数和最短路的长度; dp[u][2],dis[u][2]分别表示到u次短的路径条数和次短路的长度; if (dis[u][kind] + cost[u][v] < dis[v][1]) 表示可以更新最短,那么同时次短也会被原来的最短所更新掉,产生了两个新状态,都要添加到队列中。 else if (原创 2016-07-08 12:14:05 · 664 阅读 · 0 评论 -
hdu5409 CRB and Graph(bcc)
题目中critical的定义:对于边e<u,v>e<u, v>成为critical边的充要条件是删除这条边之后u、v不连通了,由于这图是无向图,所以显然是桥边。然后针对桥边构造一条边,使得删除边e<u,v>e<u,v>之后,u、v还是连通的。要求u v,u⪇v,u \ v,u \lneq v,u尽量的大,其次v尽量的小。分析: 1.e<u,v>e<u,v>不是桥边,那么就是0 0. 2.e原创 2016-07-18 22:38:00 · 516 阅读 · 0 评论 -
uva10651 Pebble Solitaire(记忆化搜索)
题意:给定一个长12的由o-组成的字符串,有两种操作。1."oo-"可以变成"--o".2."-oo"可以变成"o--".问通过有限次上述操作后,此符串中最少有几个'o'剩下。思路:采取记忆化搜索,因为每个位置上直有两种状态,所以状态总数有 2^12种。然后根据两种操作做递归搜索。const int maxn = 20;int dp[1 << 13];char s[20];int i原创 2016-05-14 21:27:20 · 375 阅读 · 0 评论 -
uva10003 Cutting Sticks
题目链接题目大意一根长为len的木棍,上面有n个点需要切割,切割完之后有n+1根木棍。没切一根木棍时的费用等于木棍的长度,求最小的费用和。思路记忆化搜索。solve(l, r) = min(solve(l,k) + solve(k,r)) + a[r] - a[l]。l < k < r。或者是dp,dp[l][r] = min(dp[l][k] + d[k][r] + a[r] - a[l]),原创 2016-05-24 12:01:38 · 326 阅读 · 0 评论 -
uva 1169 Robotruck(简单区间dp)
一个二位平面上有n个垃圾,现在用一个机器人去捡起来,且是按照输入顺序捡,放回位于原点处的垃圾桶中,两点之间的距离算曼哈顿距离,机器人的最大承重量为C,求捡完所有垃圾机器人走动的最小距离。sumdis[i], sum weight[i]都表示前缀和。dp[i]表示第i个捡完时的最小距离。考虑某次见掉i与j之间的所有垃圾。dp[i] = min{dp[i], dp[j-1] + sum原创 2016-03-20 20:37:40 · 520 阅读 · 0 评论 -
codeforces587B Duff in Beach
题意就是两个数组A,B其中B[i] = A[i%n],B有l个元素,A有n个元素。从B中选取x个元素,相邻元素在B中的下标满足Ij/n + 1 == I[j+1]/n。可以用dp[i][j]表示第i个数选的是j,那么dp[i][j] = ∑dp[i-1][t] && t 数字比较大,得先离散化一下,且要用滚动数组。。。。/******************************原创 2016-02-23 15:39:38 · 744 阅读 · 0 评论 -
uva111258(String Partition)
题意:题目说的是给定一串数,然后堆砌进行分割,使得每个分割快的值不大于int的最大值,,,然后求所有分割块的最大和。int的最大值也就10位数,那么我们就可以枚举位数,然后递推。d[i]表示以i结尾的最大和,然后往前递推j位数,那么[i,j]的值与dp[i-j]的和再来与dp[i]去最大。// #pragma comment(linker, "/STACK:1024000000,10240原创 2015-10-28 15:53:51 · 456 阅读 · 0 评论 -
uva10917.cppWalk Through the Forest
思路:按照题目的意思见图,然后就是DAG图上的记忆化搜索。// #pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #include原创 2015-11-13 19:32:41 · 330 阅读 · 0 评论 -
hdu1078基础dp
/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :思路:dfs + dp,,,因为只能走直线,和普通dfs一样的方向dx[i]与dy[i],由于一次最多跳k步长元,所以有nx = dx[i] * jamp + x,ny = dy[原创 2015-09-06 14:54:42 · 578 阅读 · 0 评论 -
hdi2189基础dp
/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :思路:题意就是又不超过n个素数组合成n的情况有多少种;1 2 3 4 5 6 7 8 9 。。。可以看成是数的生成情况;就是dp[i][j]表示又不超过i的素数组合成j的情况总和;那原创 2015-09-08 14:41:22 · 396 阅读 · 0 评论 -
LightOJ1018状压dp
/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :思路:题目的意思是,一个二维平面上面有不超过20个点,问最少用几条直线可以把点连完;状压dp,line[i][j]的二进制中1的个数表示i与j之间有几个点,最后的转移方程是re原创 2015-09-06 11:28:40 · 505 阅读 · 0 评论 -
hdu1723基础dp
/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :思路:整体很简单,方程就是ans[i + j] += ans[i];(i + j *****************************************///原创 2015-09-07 15:52:36 · 433 阅读 · 0 评论 -
hdu4508
/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :思路:完全背包 + 二进制优化*****************************************/// #pragma comment(linker, "/原创 2015-09-07 16:58:23 · 382 阅读 · 0 评论 -
hdu1081dp
思路:这题就是将一维最大字段和,扩展到了二维;一维的算法是这样的int max_sum(int n){ int i, j, sum = 0, max = -10000; for(i = 1; i <= n; i++) { if(sum < 0) sum = 0; sum += a[i]; if(s原创 2015-09-11 20:42:24 · 385 阅读 · 0 评论 -
LOJ1002可达路径中的最大中的最小边权
思路:这个就像是dp的概念了,只是用了SPFA的结构形式;这时的dis数组的定义就要改变了,变成S->i当前可达路径中的最大中的最小边权;更新条件就变成了 if (max(dis[u],w) 题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :Fi原创 2015-09-09 22:40:45 · 1712 阅读 · 0 评论 -
hdu1558基础dp(求最大子矩阵)
思路:用一个二元组(i,j)来表示有下标为(i,j)的前缀和,那么又下标(i,j)的x*y的子矩阵的连续和就为ans = (i,j) - (i - x,j) - (i,j - y) + (i - x,j - y);if (ans > max_num) max_num = ans;两层循环完了后,最终结果就是ans;Ps:一开始嫌弃第一种写法,结果第二种写法写丑了,wa了4发QAQ。。。原创 2015-09-09 17:45:20 · 375 阅读 · 0 评论 -
hdu4504基础dp,二维
/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :思路:定义一个二维的dp[i][j]数组就好了,*****************************************/// #pragma comment(linker,原创 2015-09-09 11:10:20 · 378 阅读 · 0 评论 -
hdu1978基础dp
/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :思路:简单dp,从点(x,y)可以走到的点的表达式是(dx + x,dy + y) && x + y 此时就可以进行状态的转移了dp[x + dx][y + dy] = (dp原创 2015-09-06 14:24:36 · 644 阅读 · 0 评论