算法竞赛-第九章
文章平均质量分 68
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
uva 10304 - Optimal Binary Search Tree(区间dp)
题目链接:10304 - Optimal Binary Search Tree题目大意:给出n个词语的出现频率(从小到达排列),要根据这些词语的出现频率建一个类似于哈夫曼编码的最优树, 不过不同的是这棵数的每个节点都应该优值,并且对于每个节点来说,左边所有的节点上的值(词语的频率)都要小于该节点, 右边的则都要大于。然后根据节点的层数*节点值, 输出最小的编码值。解题思路:原创 2013-09-22 16:15:00 · 1683 阅读 · 0 评论 -
uva 10564 - Paths through the Hourglass(dp)
题目链接:10564 - Paths through the Hourglass题目大意:给出一个沙漏形状的2(n - 1)行矩阵,并给出一个总全值和每个坐标的权值,每个位置可以走向下一行与它相邻的两个或一个位置(参见题目中的图),请找出有多少调路径上的权值和等于给定的总权值,并输出字典序最小的一条路径的起始位置 和方案。解题思路:就是数字三角的进化版, 只是本题需要记录每原创 2013-09-25 09:10:40 · 1829 阅读 · 0 评论 -
uva 607 - Scheduling Lectures(贪心+记忆化搜索)
题目链接: 607 - Scheduling Lectures题目大意:给出课题数n,以及每堂课的时间l,以及常数c,然后是n个课题所需要的时间。问题1:最少需要几节课时可以讲所有的课题讲完,并且课题的顺序不能调换,一个课题不能分在两节课讲。问题2:在用的课时最少的情况下,如何让同学们的不满意度最低,不满意度的计算是根据课时的剩余时间t计算的,解题思路:问题原创 2013-09-22 16:32:33 · 1425 阅读 · 0 评论 -
uva 10118 - Free Candies(记忆化搜索)
题目大意:10118 - Free Candies题目大意:有4堆糖果, 每堆糖果有n颗糖果,然后给出每颗糖果的类型1~20,然后只有取走当前堆的前面一颗糖果后才可以取后面的糖果, 然后小伙伴有一个篮子,篮子可以装5个糖果,如果篮子中的糖果存在相同类型的两个糖果,便可以将这两颗糖果算成一对放进腰包,问,小伙伴按什么样的方式取糖果可以取到最多的糖果。解题思路:记忆化搜索,开一原创 2013-09-26 22:51:45 · 1473 阅读 · 0 评论 -
uva 10626 - Buying Coke(记忆化搜索)
题目链接:10626 - Buying Coke题目大意:给出要买可乐的数量, 以及1元,5元和10元硬币的数量, 每瓶可乐8元,每次照钱会按照最少硬币的方式找回, 问如何投币可使得投入的硬币数最少, 输出最少硬币值。解题思路:记忆化搜索, 因为可乐每购买一次便要找会硬币,所以对与每个状态考虑的情况比并不是很多。注意:1、每够买一次可乐便会找回一次硬币,所以不用原创 2013-09-26 23:04:17 · 3747 阅读 · 0 评论 -
uva 10029 - Edit Step Ladders(dp + 二分)
题目链接:10029 - Edit Step Ladders题目大意:给出若干个按照字典序排列的字符串,每两个字符串之间可以存在一个梯度,也可不存在,所谓梯度就是指前一个字符串同过改变、删除或填加一个字符,是转化后的字符串等于后面一个字符串,问,在所给出的若干个字符串中最多能连续通过梯度连接多少个字符串,输出最大值。解题思路:类似与LIS,可是用o(n^2)的算法却超时,然原创 2013-09-25 22:01:40 · 1613 阅读 · 0 评论 -
uva 11081 - Strings(LCS)
题目链接:11081 - Strings题目大意:给出三个字符串,从分别从第一个字符串和第二个字符串中挑选子串a,b,用a和b组成第三个字符串的子串c,问可组成的子串有多少种。#include #include const int N = 70;const int tmp = 10007;int dp[N][N][N], dp1[N][N][N], dp2[N原创 2013-09-25 23:58:17 · 1874 阅读 · 0 评论 -
uva 10280 - Old Wine Into New Bottles(完全背包)
题目链接:10280 - Old Wine Into New Bottles题目大意:现在有L升酒,以及n种酒瓶,现在给出每种酒瓶的最小容量和最大容量,每种酒瓶可以使用无限多次,问,怎样装酒,可以使得剩下的酒(即未能装进酒瓶中的酒)最少,输出最小值。解题思路:刚开始直接背包,结果超时了,看了别人题解才知道要剪很大的枝,这里推荐一篇题解写的很仔细。http://blog.原创 2013-09-25 08:59:20 · 2127 阅读 · 0 评论 -
uva 11258 - String Partition(dp)
题目链接: 11258 - String Partition题目大意:给出一个字符串,由0~9组成,现在可以将字符串切割成若干段,每一段便可代表一个数值,但是这个数值不能大于int的最大上限,问,如何切割可以使得这若干个数的和最大。解题思路:一开始想用区间dp做,但是小伙伴告诉我可以用递推的方法,就去找了一下代码,确实非常简单,dp[i]表示第i位数以前的最优解,由原创 2013-09-23 23:53:55 · 2385 阅读 · 0 评论 -
uva 10913 - Walking on a Grid(记忆化)
题目链接:10913 - Walking on a Grid题目大意:给出n,k,然后给出一个n*n的图,从(1,1)通过向下,左和右三个方向,走到(n,n)点,途中不可以走相同的位置,并且路过的位置为负数的个数impossible解题思路:记忆化搜索,用四维数组去记录最优解,vis二维数组表示当前访问状态,dp[x][y][i][j]表示位置x,y的地方,当路过的负数个数原创 2013-09-23 23:42:29 · 2060 阅读 · 1 评论 -
uva 10201 - Adventures in Moving - Part IV(dp)
题目链接:10201 - Adventures in Moving - Part IV题目大意:有n个测试数据组, 对于每个测试组,最先给出一个距离lenth, 然后给出若干个加油站的位置以及加油站每升油的价钱。然后有量油桶容量为200升的卡车,出距离为0的位置开始移动向lenth,每升油可以使的卡车走一个单位距离,问,卡车到达lenth的时候,并且油箱中仍有100升油,最少花费多少钱原创 2013-09-23 23:32:58 · 1632 阅读 · 0 评论 -
uva 10911 - Forming Quiz Teams(记忆化搜索)
题目链接:10911 - Forming Quiz Teams题目大意:给出2 * n个选手的坐标, 要求将所有的选手分成n组, 每组两个人, 所有组的两个人之间的距离之和要最小, 输出最小值。解题思路:网络赛的时候写过类似的题目, 只不过是选4个点做正方形,所以思路很明确,每次选取任意两个点配对,递归搜索,并记录下来。然后我不是用未运算来记录点的状态,而开了个数组,因为位原创 2013-09-19 22:21:59 · 1612 阅读 · 0 评论 -
uva 10617 - Again Palindrome(dp)
题目链接:10617 - Again Palindrome题目大意:给出一个字符串,可以通过删除一个字符的操作,问,能形成多少种回文串?(也就是问该字符串中有多少的子串为回文串,子串可以不连续)解题思路:以前貌似做过类似的题目,所以思路很清晰,dp[i][j]代表从第i个字符到第j个字符有多少个回文子串。1、i == j时,dp[i][j] = 1。2、str[i]原创 2013-09-19 10:39:01 · 1477 阅读 · 0 评论 -
uva 825 - Walking on the Safe Side(dp)
题目链接:825 - Walking on the Safe Side题目大意:给出n,m,现在给出n行数据, 每行有k(k为不定值)个数字, 第一个数字代表行数, 后面k - 1个数代表当前行的这个位置不可走, 问有多少路径可以从(1,1)到(n,m),只能向下或向右。解题思路:dp[i][j] = dip[i - 1][j] + dp[i][j - 1], 很简单的dp原创 2013-09-18 16:46:47 · 1689 阅读 · 0 评论 -
uva 590 - Always on the run(01背包)
题目连接:590 - Always on the run题目大意:给出n和k, 然后再给出n * ( n - 1) 行数字,第i个(n - 1)行带表城市i与另外的(n - 1) 个城市之间航班。对于每一行来说已经确定的是哪两个城市之间的航班了,第一个数字代表航班价格的波动周期(天),后面day[i][j]个数代表对应日子的航班价格,现在求出k次航班后从城市1移动到城市n的花费最小原创 2013-09-18 22:28:07 · 1357 阅读 · 0 评论 -
uva 662 - Fast Food(dp)
题目链接:662 - Fast Food题目大意:给出n,m,在一条街上有n家餐馆,然后给出n家餐馆的坐标,然在可以在餐馆的基础上建设仓库m个,为了使得每家餐馆都能最快的调用食物,要求每家餐馆到距离自己最近的仓库的距离之和最小,并输出仓库所在餐馆的序号以及所服务的餐馆范围(到该仓库取货物的餐馆)解题思路:dp[k][i]表示前i个餐馆用k个仓库服务的最优解,dis[i][j原创 2013-09-28 11:16:11 · 2442 阅读 · 0 评论 -
uva 10604 - Chemical Reaction(状态压缩dp)
题目链接:10604 - Chemical Reaction题目大意:给出n和m,有n种化学药剂,型号由1~n,然后给出n * n行代表相应的两种化学药剂反应后的生成物以及释放的热量,然后给出m个试管,每种试管中有对应的药剂,要求将m种药剂反应合成一种,不要求反应后药剂的种类,要求反应所散发的热量最少。注意:i和j反应可能与j和i反应不同,反应可能吸热。解题思路原创 2013-09-30 23:30:47 · 1805 阅读 · 0 评论 -
uva 10599 - Robots(II)(LIS)
题目链接:10599 - Robots(II)题目大意:有一个row * col的矩阵,然后给出若干个坐标,代表该坐标上有垃圾,现在有一个机器人,支持向下以及向右的移动,每次移动到一个位置,可以将该位置上的垃圾清理掉,要求求出从(1,1)的位置到(row, col)最多能收多少垃圾,以及有多少条路线可以收最多的垃圾,并输出路径。解题思路:因为机器人只支持向右和向下,也就是说原创 2013-09-29 14:56:44 · 1594 阅读 · 0 评论 -
uva 10271 Chopsticks(dp)
题目连接:10271 - Chopsticks题目大意:给出m和n, 然后给出n根筷子从小到大给出, 现在要从这n根筷子中选出m + 8组筷子, 每组筷子包括三根, 现在要求所有m + 8组每组筷子中最短两根筷子之差的平方 的和最小,输出最小值。解题思路:一开始想用贪心做, 后来发现子问题是互相干预的。dp[i][j]表示在在第i根筷子已经取了j组筷子后的和的最小值,原创 2013-09-13 13:23:52 · 1550 阅读 · 0 评论 -
uva 10723 - Cyborg Genes(LIS)
题目连接:10723 - Cyborg Genes题目大意:给出两个字符串,找出第三个字符串,使得给出的两个字符串都是第三个字符串的子串,现在要求所得字符串最短,并且输出有多少种组成方法。解题思路:1、求长度:a)当s1[i - 1] == s2[j - 1]时, l[i][j] = l[i - 1][j - 1].b)当s1[i - 1] != s2[j - 1]原创 2013-10-01 15:11:32 · 1932 阅读 · 0 评论 -
uva 10003 Cutting Sticks(区间DP)
题目连接:10003 - Cutting Sticks题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价。解题思路:区间DP, 每次查找当前区间的最优解 , 并记录。需要注意的是输入的切割点并不是从小到大。#include #include #include using namespace std原创 2013-09-05 16:54:02 · 1391 阅读 · 0 评论 -
uva 10154 Weights and Measures(01背包)
题目连接:10154 - Weights and Measures题目大意:有若干只乌龟,每只乌龟有重量和负重两个属性,现在求这若干只乌龟最多可以叠多少层。解题思路:01背包的变形, 以负重值作为背包的大小, 层数为所求dp值, 每次以min(当前可负重值-乌龟的重量, 乌龟的负重)考虑。include #include #include using na原创 2013-09-08 23:33:48 · 1385 阅读 · 0 评论 -
uva 10817 - Headmaster's Headache(01背包)
题目链接:10817 - Headmaster's Headache题目大意:某个学校要师资力量不够,要招收新的老师,第一行给出s、m、n,现在在任的老师有m个,然后给出m行表示每个老师的信息,分别是该老师的工资,以及可教授的课程(个数不一定),然后在n行表示可招收的老师信息,同样是工资和课程,s表示该学校开售的课程,问,最少花多少钱可以使得该学校开设的s个课程每个课程有两个老师任教。原创 2013-09-27 21:14:02 · 1814 阅读 · 0 评论 -
uva 10534 Wavio Sequence(LIS)
题目连接:10534 - Wavio Sequence题目大意:给出一个字符串, 找出一个奇数的子序列,子序列的前版部分要递增, 后半部分要递减, 且递增和递减的长度要相等, 要求输出最长满足条件的子序列的长度。解题思路:题目可以转化成求字符串的最长递增子序列, 正向求一遍, 反向求一遍, 然后将相应位置的最长值取最小的进行比较(min(a[i], b[n - i - 1]原创 2013-09-10 23:04:52 · 1287 阅读 · 2 评论 -
uva 437 The Tower of Babylon(DAG最长路)
题目连接:437 - The Tower of Babylon题目大意:可以理解成有n种类型的长方体,现在给出每中长方体的长宽高, 然后要选取若干个长方体来玩堆积木(可以选取同种类型的长方体), 要尽量使得堆出来的塔越高, 堆积木的时候要求下面的积木长宽一定要分别大于上面的那个积木(这样同种积木也有可能叠加)。解题思路:DAG最长路径, 因为下面一个的长方体的长宽要分别大于原创 2013-09-07 21:13:32 · 1490 阅读 · 0 评论 -
uva 10453 - Make Palindrome(dp)
题目链接:10453 - Make Palindrome题目大意:给出一个字符串,通过插入字符使得原字符串变成一个回文串,要求插入的字符个数最小,并且输出最后生成的回文串。解题思路:和uva 10739的做法相似,只是本题只能插入字符,所以只要在考虑子问题的同时记录住最优的选择就可以了。#include #include const int N = 10原创 2013-09-17 20:46:04 · 1339 阅读 · 0 评论 -
uva 10163 - Storage Keepers(01背包)
题目链接:10163 - Storage Keepers题目大意:给出m为仓库的数量, 给出n为有守夜人的数量, 然后给出n个数值,为对应守夜人应付的酬劳,每个守夜人的能力与他需要的酬劳是相等的,并且守夜人可以同时负责多个仓库的安全,不过这样子安全值就变为val[i]/k(val[i]表示第i个守夜人的能力值,k表示他负责的仓库数量, /为取整),先在要的出方案,使得所有仓库中安全值最原创 2013-09-21 10:26:24 · 2341 阅读 · 0 评论 -
uva 10891 Game of Sum(区间dp)
题目连接:10891 - Game of Sum题目大意:有n个数字排成一条直线,然后有两个小伙伴来玩游戏, 每个小伙伴每次可以从两端(左或右)中的任意一端取走一个或若干个数(获得价值为取走数之和), 但是他取走的方式一定要让他在游戏结束时价值尽量的高,最头疼的是两个小伙伴都很聪明,所以每一轮两人都将按照对自己最有利的方法去取数字,请你算一下在游戏结束时,先取数的人价值与后取数人价值只原创 2013-09-13 00:19:45 · 1971 阅读 · 0 评论 -
uva 10635 - Prince and Princess(LCS)
题目连接:10635 - Prince and Princess题目大意:给出n, m, k,求两个长度分别为m + 1 和 k + 1且由1~n * n组成的序列的最长公共子序列长的。解题思路:按一般的o(n^2)的算法超时了,所以上网查了下LCS装换成LIS的算法o(nlogn)。算法仅仅是将其中的一个序列重新标号1~m,然后按最长公共子序列的方法去做。原创 2013-09-19 23:32:52 · 2021 阅读 · 0 评论 -
uva 10651 - Pebble Solitaire(记忆化搜索)
题目链接:10651 - Pebble Solitaire题目大意:给出一个12格的棋盘,‘o'代表摆放棋子,’-‘代表没有棋子, 当满足’-oo'时, 最右边的棋子可以跳到最左边的位子,而中间的棋子则被消除,‘o--', 问对于一个给定了的棋盘,通过上述消除棋子的方法最后最少绳几个棋子在棋盘上。解题思路:递归搜索 + 记忆化, 并且记忆化的值为所有测试数据公用的,也就是原创 2013-09-17 21:39:44 · 1199 阅读 · 0 评论 -
uva 10306 - e-Coins(完全背包)
题目链接:10306 - e-Coins原创 2013-09-17 21:03:06 · 1690 阅读 · 0 评论 -
uva 10465 Homer Simpson(完全背包)
题目连接:10465 - Homer Simpson题目大意:有两种汉堡包, 给出吃汉堡的时间, 再给出总的时间, 尽量不浪费给出的时间,输出能最多吃的汉堡个数, 如果一定需要浪费时间, 输出浪费时间最少的时刻内能吃的最多汉堡个数, 并再后面输出浪费掉的时间。解题思路:因为汉堡可以无限制的使用, 所以相当于是完全背包问题,dp[i]就是代表在i分钟之内最多能吃多少汉堡(时间原创 2013-09-10 21:23:02 · 1352 阅读 · 0 评论 -
uva 10404 Bachet's Game(完全背包)
题目连接:10404 - Bachet's Game题目大意:由一堆石子, 给出石子的总数, 接下来由stan和ollie两个人玩游戏,给出n, 在给出n种取石子的方法(即为每次可取走石子的数量),由stan先,两人轮流取走石子,最后一个将石子全部去完的人胜利,问, 给出的一堆石子, 两人均按最好的方案游戏, 最后将会是谁胜 ?解题思路:问题可以看做是一个完全背包的变形原创 2013-09-11 00:06:44 · 4785 阅读 · 0 评论 -
uva 620 Cellular Structure
题目连接:620 - Cellular Structure题目大意:给出一个细胞群, 判断该细胞的可能是由哪一种生长方式的到的, 输出该生长方式的最后一种生长种类, "SIMPLE" -----------------------由 空 生成 ‘A'"FULLY-GROWN" ----------------在 原细胞群(不能为空)的后面 加上 ’AB'MUTAN原创 2013-09-10 22:52:16 · 1856 阅读 · 0 评论 -
uva 674 Coin Change(完全背包)
题目连接:674 - Coin Change题目大意:有5种硬币, 面值分别为1、5、10、25、50,现在给出金额,问可以用多少种方式组成该面值。解题思路:每种硬币都有无限个,所以是典型的完全背包, 一开始写的时候没有考虑到面值的重复问题, 打表的时候将金额值逐一去计算, 但又使用到cnt[i] += cnt[i - sex[j]], 然后导致有些组成方式重复考虑进去(原创 2013-09-04 09:07:41 · 2833 阅读 · 1 评论 -
uva 10192 - Vacation(LCS)
题目大意:10192 - Vacation题目大意:求两个字符串的最长公共子序列。解题思路:套用dp的状态转移方程。#include #include const int N = 1005;int max(const int& x, const int& y) { return x > y ? x : y; }int n, m, dp[N][N];c原创 2013-09-03 22:43:51 · 1191 阅读 · 0 评论 -
uva 111 History Grading(LCS)
题目连接:111 - History Grading题目大意:给出一个n 代表序列中元素的个数, 然后是一个答案, 接下来是若干个同学的答案(直到文件结束为止), 求出两个序列的最长公共子序列, 注意给出的答案均是以该事件处于第几个发生的, 例如 :2 3 4 1即是 对应第1个事件在第2个发生,第2个事件在第3个发生 ...转换一下就是 4 1 2 3。解题思路原创 2013-09-03 22:06:28 · 1632 阅读 · 0 评论 -
uva 10405 - Longest Common Subsequence(LCS)
题目连接:10405 - Longest Common Subsequence题目大意:求两个字符串的最长公共子序列。解题思路:套公式。#include #include const int N = 1005;int max(const int& a, const int& b) { return a > b ? a : b; }char a[N],原创 2013-09-03 22:17:57 · 1036 阅读 · 0 评论 -
uva 11151 Longest Palindrome(LCS)
题目连接:11151 - Longest Palindrome题目大意:给出一个字符串,计算这个字符串的最长回文子串, 不同的是,它的子串可以不连续。解题思路:刚开始把这道题当成普通的回文串来做了, 用了manachar算法, 让后一直WA, 然后才发现原来子串可以不连续, 但是其实就是求当前这个字符串和其逆序的最长公共子序列。#include #includ原创 2013-09-07 22:58:53 · 1273 阅读 · 0 评论 -
uva 531 Compromise(LCS)
题目连接:531 - Compromise题目大意:给出两组字符串, 各含若干的字符串, 要求求两组字符串的最长公共子序列, 并输出最长的方案, 若有多种可能输出任意一种。解题思路:普通的最长子序列问题, 和一般求解一样, 不过要记录路径, 我的做法是开两各数组记录移动方式, x[p][q], y[p][q]。当x[p][q] == p - 1 && y[p][q] ==原创 2013-09-08 10:29:19 · 1273 阅读 · 0 评论