- 博客(26)
- 资源 (2)
- 收藏
- 关注
原创 POJ 3041 Asteroids (匈牙利算法)
题目大意给出n*n的矩形,k个点。每次可选择删除一行或一列的点,求至少需要删除几次方可将点全部删除。分析构造有向二分图:把每行x或者每列y看成一个点,而障碍物(x,y)可以看做连接x和y的边。问题就转化成为选择最少的一些点(x或y),使得从这些点与所有的边相邻,其实这就是最小点覆盖问题。Konig定理: 最小点覆盖数 = 最大匹配数用匈牙利算法求二分图的最大匹配即可代码#include
2015-10-28 20:48:18 340
转载 匈牙利算法详解
转自:http://blog.csdn.net/dark_scope/article/details/8880547【书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程】匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径
2015-10-28 20:23:24 399
原创 POJ 1094 Sorting It All Out (拓扑排序)
题目大意给出一个数n,表示有n的大写字母,从A开始。然后给出m个字符串,均是X < Y的格式,其中X,Y均是单个的大写字母。问根据这m个字符串得到前n个字母的关系:全序,有环,偏序按以下三种格式输出:Sorted sequence determined after **i** relations: **XXXX**.Inconsistency found after **i** relati
2015-10-26 22:38:39 319
原创 POJ 3026 Borg Maze (Prim)
题目大意给出m行n列的矩阵,所有元素均为’#’,’ ‘, ‘A’ ,’S’。其中#代表墙,即不可通过,’ ’ 则代表路。要求从S出发到达所有A的道路长度。分析所有字母都作为结点,字母之间的距离作为边,构造图。首先用BFS找出每个节点到其他点的距离,从而得到边然后直接prim求解代码/* 所有字母都作为结点,字母之间的距离作为边,构造图 * 首先用BFS找出每个节点到其他点的距离,从而构
2015-10-25 22:38:56 337
原创 POJ 1789 Truck History (Prim)
题目大意给出n个长度为7的串,串之间的dis为两个串中不同字母的个数,任何一个串都是可以由其它串得到,代价是两个串的dis求将所有串转换成同一个串的最少代价分析以串作为结点,串之间的代价作为边,建图。然后就是直接求最小生成树代码#include <iostream>#include <string>#include <cstring>using namespace std;#def
2015-10-25 20:12:31 283
原创 POJ 2240 Arbitrage (Floyd)
题目大意给出n种货币,以及m种对换方式的兑换率。求通过兑换能否使钱增加。分析dis[i][j]表示货币i兑换货币j的最大兑换率。求出所有货币的之间的最大兑换率。最后查看dis[i][j] * dis[j][i] 是否大于1即可。初始化dis[i][j] = (i == j ? 1 : 0);直接使用Floyd算法即可代码#include <iostream>#include <stri
2015-10-25 16:43:05 307
原创 POJ 1125 Stockbroker Grapevine (Floyd)
题目大意给出n个经纪人,接下来的n行,每行的第一个数m代表该经纪人的朋友数。紧接着有m对数,第一数代表朋友编号,第二个表示将消息传给该朋友所需时间。求从某个人开始,将消息传送到所有人所需花费的最少时间。分析很明显,要求出任意两点的最短路径,用Floyd算法。然后遍历结果数组dis,求出每一行的最大值的最小值即可。代码#include <iostream>using namespace s
2015-10-25 15:58:49 373
原创 POJ 2253 Frogger(floyd 或 dijstra)
题目大意出个n个点的坐标,任意两个点都是互相可到达的。求第0点到第1点的所有路径中,长度最大的边的最小值。Floyd算法求解Floyd是求图中任意两个点的最短路,即dis[i][j]表示i到达j的最短距离。这里稍作变换,令dis[i][j]表示i到达j的所有路径中长度最大的边的最小值。则if(dis[i][j] > max(dis[i][k] , dis[j][k])) dis
2015-10-25 14:31:24 332
原创 POJ 1062 昂贵的聘礼 (dijkstra)
题目大意有n个物品,编号为1…n,每个物品都有三个属性P、L、X(X < N),分别表示物品的价格,等级,替代品数量(即使用其它物品来替代该物品后,只需付出那个物品的价格和替代后的优惠价格即可得到该物品)。给定m,表示物品之间相差等级不能超过m。假设3个物品,m=1,等级依次为1,2,3。可以用2替代1,却不能使用3替代2,因为1,3之间等级超过m。求得到物品1的至少需要付出的金币数量分析
2015-10-24 21:06:42 377
原创 POJ 3259 Wormholes (Bellman-ford)
题目大意给出n个点,m条边以及w个虫洞。每条边都是双向的,并且有一个权值v表示通过这条边需要花费秒。每个虫洞是单向的且有一个权值v表示通过这个虫洞可以回到v秒之前。求最终到达起点时,所花费时间相对于起始时间是否为负分析判断是否存在负环即可#include <iostream>#include <vector>using namespace std;#define INF 0x3ffff
2015-10-24 17:21:39 317
原创 POJ 1860 Currency Exchange(Bellman-Ford)
题目大意给出n个顶点,m条边,原点s及初始金钱v。每条边有6个参数from, to, c1, r1, c2, r2。假设在from出有v的金钱,从from -> to,金钱 = (v - c1) * r1; 假设在to出有v的金钱,从to -> from,金钱 = (v - c2) * r2;求从s出发,最终回到s时金钱能否增长分析把每条双向边改写成两条单向边。只需用Bellman-F
2015-10-24 16:03:52 319
转载 Bellman-Ford算法详讲
概要Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。所以就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个,时间复杂度O(VE)。spfa是在Bellman-Ford上的队列优化,时间复杂度O(kE) (k << V),但在最坏的情况下,有可能退化
2015-10-24 15:54:51 481
原创 HDU 2825 Wireless Password (AC自动机+DP+状态压缩)
题目大意有m个单词,每个单词的长度不超过10。求长度为n的串包含至少k个单词的串的数量,所有字符均有小写字母组成。(0<=m<=10,1<=n<=25)分析将所有单词构造成AC自动机用状态压缩表示单词,val[i]表示结点i包含的单词;状态dp[i][j][k]表示长度为i的串,到达状态j,包含k的word时的数量状态转移方程dp[i+1][v][k|val[v]] += dp[i][j
2015-10-15 21:19:47 486
原创 POJ 1625 Censored! (AC自动机+DP+大数加法)
题目大意给出包含N个字符的字典,组成长度为M的句子,求无禁止单词的句子有多少个。禁止单词有P个,单词长度不超过10,所以字符的ASCII码均大于32(1 <= N <= 50, 1 <= M <= 50, 0 <= P <= 10)。分析状态dp[i][j]表示第i步时,到达状态j的字符串数,途中不能经过危险结点则状态转移方程为dp[i][j] = sum(dp[i-1][k]),其中j是k
2015-10-14 22:53:43 380
原创 POJ 1054 The Troublesome Frog
题目大意给你一块m*n的矩阵,以及num个点的坐标,含有点的数量最多的直线所含有的点的数量。要求:直线上的点间距要相等,不足3个点的记为0。若前k个点在矩阵内,第k+1个点的坐标也在矩阵内,但矩阵中不存在该点,则此直线无效。分析先对坐标按x排序,若x相等,则按y排序枚举每条直线上的**前两个点**s1 ,s2即可。计算出步长lenx = s2.x - s1.x , leny = s2.y
2015-10-10 20:48:24 487
原创 POJ 1191 棋盘分割 (DP)
题目大意输入一个8*8的矩阵,将其分解成n个矩阵,使各矩阵总分的均方差最小。均方差,其中平均值,xi为第i块矩形棋盘的总分。 分析将方差公式化简成s^2 = (x1^2+…+xn^2) / n - x^2,x为平均值dp[i][x1][y1][x2][y2]表示对于(x1,y1)(x2,y2)的矩阵,第i次分割后得到的平方和的最小值sum[x1][y1][x2][y2]表示矩形(x1,y
2015-10-09 18:31:37 316
原创 ZOJ 2319 Beautiful People (LIS的变形)
题目大意有n个人的,每个人有一个si和bi,对于i和j来说,只有当si < sj && bi < bj ,或者 si > sj && bi > bj 时,二人才不会互相讨厌。也就是说,只有两个人其中一方的s和b都小于另一方时,二人才不会互相讨厌。求最多有多少人不会互相讨厌分析给n个人按s排序从小到大,若s相等则按b从大到小排序。然后求b的最长上升子序列的长度ans即可用O(nlogn)
2015-10-08 20:06:59 420
原创 POJ 1159 Palindrome (LCS)
题目大意给出一个字符串s,求至少添加几个字符使之成为一个回文串分析求出s与s的逆序s’的最长公共子序列的长度d,然后len - d即可dp[i][j]表示s串种1…i和n…n-j的最长公共子序列的长度状态转移方程若s[i] = s[j],则dp[i][j] = dp[i-1][j-1] + 1 否则,dp[i][j] = max(dp[i][j-1] , dp[i-1][j])由于s长度
2015-10-08 18:51:07 329
原创 POJ 1080 Human Gene Functions (类似LCS)
题目大意题目给出一张5*5的映射表,分别是ACGT-,每对字符都有一个相似值。给出两个字符串,由ACGT组成,求两个字符串匹配的最大相似值和,可以用-代替字符匹配。分析类似求最长公共子序列dp[i][j]表示s1中1….i和s2中的1….j匹配的最大相似值状态转移方程dp[i][j] = max{dp[i-1][j-1]+mp[a][b] , dp[i-1][j]+mp[a][4] ,
2015-10-08 16:21:19 257
原创 POJ 1163 The Triangle (数塔)
题目大意一个n层的数塔,从第一层走到最后一层,沿途经过的数的最大值分析dp[i][j]表示到达(i , j)时的最大值状态转方程dp[i][j] = max(dp[i-1][j-1] , dp[i-1][j]) + a[i][j];代码#include <iostream>#include <cstring>using namespace std;const int maxn = 360
2015-10-08 14:05:09 284
原创 POJ 2533 Longest Ordered Subsequence (LIS)
求最长上升子序列的长度O(n^2)的算法dp[i]表示以i结尾最长上升子序列的长度状态转移方程:dp[i] = max(d[j])+1,j代码//时间复杂度O(n^2)的算法#include <iostream>using namespace std;const int maxn = 1010;int dp[maxn]; //dp[i]表示以i结尾最长上升子序列的长度int a[maxn
2015-10-08 13:02:01 281
原创 POJ 1260 Pearls (简单DP)
题目大意给出n类珠子,以及每类珠子的数量num[i]和单价val[i]。单价从小到大排序,买每一类珠子的价格是(num[i]+10)*val[i]。问买sum(num[i])的珠子,所需最少花费。其中,价格较低的珠子可有价格高的珠子替代,反之不行。分析很容易看出,珠子是不能跳跃替代的。比如说,若用第3类珠子替代第1类珠子时,则第2类珠子也要由第3类珠子替代。否则,用第2类珠子替代第1类珠子更
2015-10-08 12:10:49 446
原创 POJ 1836 Alignment (简单DP)
题目大意给出n个浮点数(2 <= n <= 1000 , 0.5 <= 浮点数 <=2.5),然后求一段序列长度ans,要求这个序列中从左到右递增,或者从右到左递增。输出n - ans分析求最长上升子序列和最长下降子序列的长度dp1[i]表示以i结尾的最长上升子序列的长度dp2[i]表示以i结尾的最长下降子序列的长度然后枚举两段区间[0,i] [j,n-1]时间复杂度O(n^2)代
2015-10-07 16:34:01 279
原创 POJ 3267 The Cow Lexicon (简单DP)
题目大意输入一个长度为m的文本串,n个模板。求在文本串中至少去掉几个字母可以完全匹配模板。(2<= m1<= 300, ≤ n ≤ 600,模板串长度 ≤ 25),全部由小写字母组成。分析dp[i]表示以i结尾的子串至少需要去掉字符数状态转移方程: dp[i] = min(dp[i] , tmp+dp[j]),其中tmp为匹配模板需要去掉的字符数,j是匹配完后的位置。初始化dp[i] = d
2015-10-05 16:57:25 327
原创 POJ 1837 Balance (简单DP)
题目大意一架天平,天平上有m个钩子,有n个砝码(2 <= c <= 20,2 <= G <= 20),天平的坐标范围为[-15,15]。给出m个钩子的坐标c[i](-15<=c<=15),以及n个砝码的重量g[j](1 <= g <= 25),要求所有砝码都要用到,求最终平衡的方案数分析dp[i][j] 表示对于前i个砝码,在平衡度为j时的方案数最大平衡度maxn = 15 * 20 *
2015-10-05 14:06:50 479
原创 POJ 1276 Cash Machine (多重背包)
题目大意给定cash,N,表示有cash现金,N种账单。每种账单的额度为D[i],数目为n[i],求在不超过cash的前提下,最多能兑换到到少money。分析对于每种额度的账单,可选择k张(0 , 1 , … , n[i]),很明显的多重背包问题。状态:dp[j]表示在剩余j的现金下,前i种账单最多能兑换到的money状态转移方程: dp[j] = max(dp[j] , dp[j-D[i
2015-10-03 15:48:18 273
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人