ACM
文章平均质量分 77
专攻挖掘机炒鸡蛋算法
Hahahahaha!
展开
-
UVa #10817 Headmaster's Headache (例题9-15)
需要注意的一个细节是 s0 s1 s2改变后,不能再用 d[i][s1][s2] 来更新dp值。最好用引用来简化代码并减少出错。Run Time: 0.549s#define UVa "LT9-15.10817.cpp" //Headmaster's Headachechar fileIn[30] = UVa, fileOut[30] = UVa;#include#in原创 2015-02-24 11:41:33 · 534 阅读 · 0 评论 -
UVa #1025 A Spy in the Metro (例题9-1)
第一道动态规划。。书中给的状态转移的设计感觉很巧妙要注意下数组大小避免RE。Run Time: 0.032s#define UVa "LT9-1.1025.cpp" //A Spy in the Metrochar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#includeusing nam原创 2015-02-13 13:49:24 · 569 阅读 · 0 评论 -
UVa #437 The Tower of Babylon (例题9-2)
记忆化搜索,前两天看mit算法导论公开课里面Charles说这个memoization不算是动态规划,递推的才是。。有机会的话回过头来写一些递推的细节上,Rujia再一次给了这样的提示:如果数据范围太大但比较稀疏,则考虑给他们编码。在第五章的例题中(UVa 12096 The SetStack Computer(例题5-5),UVa 1592 Database(例题5-9)原创 2015-02-13 14:46:38 · 510 阅读 · 0 评论 -
UVa #1627 Team them up! (例题9-19)
要求同一个队伍里的人互相认识,则一对互相不认识或者单方面认识的人必须被分到不同的队伍。根据后面这条规则进行分组会比较简单所以我们可以从一个人出发,递归寻找所有“存在着不互相认识”关系的人,形成一个图,再给这个图里的所有人加正反标记,保证相邻的人都有相反的标记。若存在相邻的人有着相同的标记,则输出无解。之后再根据正反标记,把他们放到相应的组里面。这样就把人分成了很多个连通块,原创 2015-03-02 16:42:37 · 1452 阅读 · 2 评论 -
UVa #10618 Tango Tango Insurrection (例题9-18)
一开始偷懒没读原题,根据白书里的描述似懂非懂的做了,WA了还纳闷半天。最好还是先读原题啊,有些看似无用的句子会给很多有用的信息每个决策要受到几个因素的影响:1、当前时间 2、左脚位置 3、右脚位置 4、上一次动了哪只脚前三个因素比较intuitive。第4个因素来自题目中的叙述:如果这次动的脚和上次的不同,则只消耗1个能量。如果这次和上次动的是同一只脚,则分三种情况,分别对原创 2015-03-03 13:43:51 · 1117 阅读 · 0 评论 -
UVa #1336 Fixing the Great Wall (例题9-21)
这道题的动态规划部分还比较直观:每次只有两个决策:向左走或者向右走。根据这个可以设计出状态:d(i,j,k)表示区间 [i,j] 已经被修复,目前处于最左端(k=0)或最右端(k=1)。另外, c 值的总和是固定的,不论决策如何,最终都是一样的。因此不用加入状态转移。不过最后不要忘了加上它;因此只用考虑 delta 就可以了。每次转移的代价就是区间 [i,j] 以外的所原创 2015-03-05 14:09:00 · 2017 阅读 · 0 评论 -
UVa #1395 Slim Span (例题11-2)
这道题的目标是最大权值和最小权值的差最小,和最小生成树不太一样。我们可以暴力枚举最小权值(放弃权值更小的边),然后求最小生成树。因为Kruscal算法按照权值顺序考虑各条边,所以一旦所有点连通,则可以计算出最大权值和最小权值的差并记录,然后continue。Run Time: 0.079s#define UVa "LT11-2.1395.cpp" //Slim Sp原创 2015-03-26 11:41:25 · 710 阅读 · 0 评论 -
UVa #1151 Buy or Build (例题11-3)
套餐只有8个,可以暴力枚举。不过边太多,不能枚举套餐都求一遍最小生成树。其实只需要在一开始求出不包含套餐的最小生成树,把这些边记下来备用。之后枚举套餐的时候,先把套餐中的点全部加入并查集,然后在原最小生成树的基础上,再来求最小生成树就可以了。那些一开始就没有被加入最小生成树的边,到了暴力枚举又加入很多权值为0的边排在他们前面,就更加不会被包含到最小生成树中了。原创 2015-03-26 11:51:46 · 859 阅读 · 0 评论 -
UVa #658 It's not a Bug, it's a Feature! (例题11-6)
和第七章的题目很像,dijkstra求隐式图最短路。Run Time: 2.202s#define UVa "LT11-6.658.cpp" //It's not a Bug, it's a Feature!char fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#include#inclu原创 2015-03-26 13:57:25 · 620 阅读 · 0 评论 -
UVa #1625 Color Length (例题9-8)
看到后面例题9-21也用了这题的方法,把这题补上这题:在放置颜色的时候,需要判断它是不是最后一个,然后需要找到这个颜色的开始位置。如果把每个颜色的开始位置记录在状态中,状态空间将会太大但是每次放置颜色,如果有 a 种颜色还没有结束,那么这 a 种颜色结束的时候,与初始位置的距离肯定要+1。每种颜色开始和结束的位置我们可以事先算出,因此我们可以在状态转移的时候判断当前还有多少原创 2015-02-27 15:15:10 · 784 阅读 · 0 评论 -
UVa #10366 Faucet Flow (习题8-24)
#define UVa "8-24.10366.cpp" //Faucet Flowchar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#include#include#include#include#include#include#include#include#include#原创 2015-02-12 18:10:38 · 686 阅读 · 0 评论 -
UVa #11536 Smallest Sub-Array (习题8-17)
理解题目:有一些不同颜色的散点分布在整数数轴上,找出一条线段,使得线段内拥有所有颜色的点一开始觉得有点像是区间覆盖问题,但是这里的散点和区间的性质有些不同,似乎无法使用贪心法然后考虑,题目的描述有点像滑动窗口,故尝试滑动窗口+二分查找找出窗口大小的最小值运行时间是有惊无险的7s,由于要求的是8s,所以我的算法是一半TLE一半AC。等复习白书的时候再回过头来优化这原创 2015-02-11 17:23:48 · 589 阅读 · 0 评论 -
UVa #1252 Twenty Questions (例题9-16)
2.5s低空飘过集合上的动态规划,中间状态一般就是全集的子集合。为了精确的描述状态,一般增加一个或多个维度。这道题全集就是所有的特征,中间状态就是询问了某一些特征。询问的结果则要用另一个维度来储存。动态规划的过程就是把所有可能的询问遍历一遍,在每次遍历的同时,遍历所有的询问结果的可能性。边界值及时返回、重叠子问题及时返回,避免重复运算。Run原创 2015-02-24 15:14:02 · 587 阅读 · 0 评论 -
UVa #1152 4 Values whose Sum is 0 (例题8-3)
这道题虽说不难但是还是摩擦了半天。另外例题8-2感觉很神奇,就不放代码了网上不少人用了数组排序的方法,也有自己实现hash_map的方法。我用了哈希,主要是为了练习练习自己写哈希要注意一些对性能会造成影响的部位:1、vectorvector中的元素多了之后,push_back的速度非常非常慢。数据量大的时候要避免vector2、memset在原创 2015-01-23 17:54:31 · 807 阅读 · 0 评论 -
UVa #1615 Highway (习题8-11)
Run Time: 0.028s#define UVa "8-11.1615.cpp" //1615 - Highwaychar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#include#includeusing namespace std;//Global Variables. Rese原创 2015-02-09 17:36:24 · 1007 阅读 · 0 评论 -
UVa #1153 Keep the Customer Satisfied (习题8-12)
太担心于算法的正确性,一不留神被输出的空行要求坑了。凡是只给一组sample的,都应该首先留意输出格式的文字要求另外,题目的"before its due date"也是坑啊,加一个"or on"会怀孕么Run Time: 0.399s#define UVa "8-12.1153.cpp" //Keep the Customer Satisfiedchar原创 2015-02-10 16:46:56 · 580 阅读 · 0 评论 -
UVa #10934 Dropping water balloons (例题9-20)
最初的想法应该是:d(i,j) 表示用 i 个球在高度为 j 的楼里做实验,需要的最少实验次数。可是层数太大,无法作为状态。进行一下问题的转换:设 d(i,j) 表示用 i 个球做 j 次实验最高可以测试多少层楼。最后只需选取 d(k,j) >= n 的最小的 j 即可状态的转移很有意思:假设我们现在对 d(i,j) 做决策,如果气球爆了,则实验可以测定的层数等于 d(原创 2015-02-26 11:09:24 · 692 阅读 · 0 评论 -
UVa #120 Stacks of Flapjacks (例题8-1)
第八章真是严肃活泼的算法设计试着读原题真是跪了,就是个摊煎饼问题却要扯一大堆有的没的算法还是挺好想的,先把最大的翻到最上面,再连锅翻过来,最大的就到最底下了。之后就可以不用管这个煎饼了。不过对于当前最大煎饼的位置要分类讨论:如果已经在最底下就什么也不做,如果已经在最顶上就直接连锅翻,如果在中间则需要按照上面的方法翻两次。Run Time: 0.012原创 2015-01-23 11:03:57 · 648 阅读 · 0 评论 -
UVa #1218 Perfect Service (例题9-14)
发现动态规划的时间复杂度等于dp数组开的大小。像这道题是n*3,复杂度为O(n)。之前有些题目是n*n,复杂度就是O(n^2)不像例题9-13,这道题本身是无根树,记忆化搜索的函数要加一个父亲节点作为参数。Run Time: 0.045s#define UVa "LT9-14.1218.cpp" //Perfect Servicechar fileIn[30] =原创 2015-02-23 16:06:40 · 634 阅读 · 0 评论 -
UVa #1220 Party at Hali-Bula (例题9-13)
新年第一题,一道树上的动态规划,树的最大独立集问题。书中的介绍部分讲解了刷表法,却说有一种更实用的方法将在例题中介绍,应该说的就是这题。按照这种方法的思路,我们不必枚举所有儿子和所有孙子,只需要加一个维度来表示是否选中当前节点然后只枚举儿子。对于已经选中的节点,在记忆化搜索的递归时,将它所有儿子的这个维度设为“不选中”即可。对于不选中的节点,则对于每个儿子,原创 2015-02-23 14:26:46 · 1040 阅读 · 0 评论 -
UVa #12096 The SetStack Computer (例题5-5)
这道题的思想在后面用到了几次,因此还是贴出来:这道题是一个编码问题,即将某种数据结构通过一定的方法转化为独特的整数。这样就可以用整数来进行操作,大大简化了程序。对于这道题中的集合来说,一个集合包含了0或多个集合,并且可能有多层嵌套,无法用STL的set来模拟。但是我们可以给每一种集合分配一个ID。比如我们给{}分配1,{{}}就可以表示成{1},我们给他分配2。{{},{}原创 2015-03-26 11:13:15 · 1272 阅读 · 0 评论 -
UVa #247 Calling Circles (例题11-4)
图的连通性问题。两个人相互连通当且仅当两人互相直接或者间接打过电话。因为间接通话的存在,无法直接用dfs来求连通块。要用Floyd算法实现的传递闭包来预处理两人是否直接或间接的通过话。Floyd算法完后则可以用dfs求出所有连通块了。Run Time: 0.059s#define UVa "LT11-4.247.cpp" //Calling Circleschar原创 2015-03-26 13:38:16 · 677 阅读 · 0 评论 -
UVa #10048 Audiophobia (例题11-5)
因为会输入多组查询,因此用Floyd算法进行预处理效率会比每次重新算的效率要高一些。因为题目要求的是一条最大权值最小的路,因此Floyd算法中的松弛操作的右边应该从加法变为max()。Run Time: 0.022s#define UVa "LT11-5.10048.cpp" //Audiophobiachar fileIn[30] = UVa, fileOut[原创 2015-03-26 13:48:54 · 602 阅读 · 0 评论 -
UVa #1658 Admiral (例题11-9)
每个点只能访问一次,可以将每个点拆成两个点,中间连一条费用为0、容量为1的边。这样求最小费用最大流时就保证了每个点只访问一次。因为是两艘船走,所以限制流量为2,求出最小费用即可。注意点数会翻倍,数组也要多开一倍大。Run Time: 0.046s#define UVa "LT11-9.1658.cpp" //Admiral#include#in原创 2015-03-28 15:15:40 · 594 阅读 · 0 评论 -
UVa #10118 Free Candies (习题9-2)
影响决策的条件有二:四个堆最顶端的糖的颜色,以及目前篮子里有什么颜色。可以用四个指针,分别代表四个堆目前的位置。每次决策有四种:分别从四个堆的顶部取糖果。状态则可以设计成d(p1, p2, p3, p4)代表目前指针的位置为p1, p2, p3, p4,最多可以踹走多少糖果。同时用二进制表达来代表篮子里的糖果颜色种类Run Time:0.369s#define UVa原创 2015-03-07 14:24:27 · 699 阅读 · 0 评论 -
UVa #12325 Zombie's Treasure Chest (例题7-11)
书中的分类枚举法一举克服了普通枚举最大10^9的规模:第一种宝藏最多n/s1个,所以宝藏1的数量可以从1枚举到n/s1,同时算出宝藏2最多多少个,求出总价值。宝藏2最多n/s1个,枚举方法同上。因此如果n/s1比较小,就枚举宝藏1,n/s2比较小就枚举宝藏2 如果n很大而s1 s2很小,则用以下的枚举法:s2个宝藏1和s1个宝藏2体积相等,但价值分别为s2*v1原创 2015-03-12 15:07:39 · 787 阅读 · 0 评论 -
UVa #1349 Optimal Bus Route Design (例题11-10)
这道题作为一道regional,最值得学习的应该是问题的等价转换。把“找出几个圈,使得所有的点都只存在于一个圈内”,转换为“给每个点找一个孩子,使得一个点只有一个父亲”。转换后的问题,就可以用二分图匹配来做了:每个点拆成两部分分别放在二分图的S和T,使得S到T的连线代表儿子-父亲的关系。之后再求二分图的带权值的完美匹配,则可以保证每个结点只有一个儿子、一个父亲的情况下,求出最小费用了。原创 2015-03-29 23:21:50 · 810 阅读 · 0 评论 -
UVa #11582 Colossal Fibonacci Numbers! (例题10-1)
预处理求出n分别为1-1000时斐波那契模数列的周期,之后求出a^b是周期中第几个即可。复习了模算术、幂取模,顺便学习了分治法取模的迭代版本。Run Time: 0.072s#define UVa "LT10-1.11582.cpp" //Colossal Fibonacci Numbers!char fileIn[30] = UVa, fileOut[3原创 2015-03-12 17:36:56 · 922 阅读 · 0 评论 -
UVa #12661 Funny Car Racing (例题11-11)
带权最短路。但松弛操作需要分类讨论,要考虑清楚。Bellman-Ford和Dijkstra速度差不多。Run Time: 0.139s#define UVa "LT11-11.12661.cpp" //Funny Car Racingchar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#i原创 2015-03-30 16:18:23 · 935 阅读 · 0 评论 -
UVa #821 Page Hopping , UVa #820 Internet Bandwidth (习题11-1,11-3)
一个Floyd最短路,一个EdmondsKarp最大流Run Time: 0.128s#define UVa "11-1.821.cpp" //Page Hoppingchar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#include#includeusing namespace原创 2015-04-16 18:09:28 · 945 阅读 · 0 评论 -
POJ #1050 1088 1141 1732 (dp初步练习)
POJ 1050 To the Max:最大子矩阵和问题,枚举行数,将两行之间的元素纵向压缩为一维数组,然后求最大子区间和。动态规划部分时间复杂度O(n^3),空间复杂度优化后O(n),用于保存压缩后的一维数组。#define UVa "poj-1050.cpp" //To the Maxchar fileIn[30] = UVa, fileOut[30] = UVa;#in原创 2015-04-20 17:53:51 · 824 阅读 · 0 评论 -
UVa #1632 Alibaba (习题9-8)
区间dp,和UVa #1336 Fixing the Great Wall (例题9-21)类似。但数据规模太大,记忆化搜索会TLE,必须递推。我一开始把状态设计为dp(i,j,k)表示当前已访问区间为[i,j],且站在 i (k == 0)或 j (k==1),最少还需多少时间收集全部宝藏。同时还需要一个辅助数组来记录当前已经经历的时间,来判断是否过了deadline。这个设计很臃肿原创 2015-03-10 11:26:07 · 1020 阅读 · 2 评论 -
UVa #10163 Storage Keepers (习题9-9)
0-1背包模型,每个人的决策为装 0-j 个storage,j为当前剩余storage的数量先求出最大的L,再用这个L重新做一次dp,找出最小的YRun Time: 0.016s#define UVa "9-9.10163.cpp" //Storage Keeperschar fileIn[30] = UVa, fileOut[30] = UVa;#inclu原创 2015-03-09 17:40:46 · 517 阅读 · 0 评论 -
UVa #1380 A Scheduling Problem (例题9-26)
居然一次就过了。。做了两天,泪流满面啊。不过代码跑得很慢。。有机会优化一下这道题想清楚了还是很简单的,但是一开始的思路不容易理顺。下面文中我的f和g与Rujia书中的定义相反,请注意区分。题目里说,把所有的无向边去掉之后,最终答案则一定是由剩下的有向边组成的最长路径长度k或者k+1。所以我们的工作就变成了:给无向边分配方向,使得最后得到的树里,最长路径长度是否可原创 2015-03-20 15:58:00 · 1321 阅读 · 0 评论 -
UVa #12219 Common Subexpression Elimination (例题11-1)
这题和普通的表达式树很像,但如果按照一般的做法(用L、R代表范围),会TLE,因为重复了太多无用的扫描这题树中的结点对应的子树都是二叉树,不存在只有一个儿子的情况。输入的字符串中也只有两种情况,结点名字后面紧跟一个左括号的,和不跟括号的。因此很容易判断一个结点是否为叶子结点:只要在原字符串中看他后面有没有紧跟着左括号就行了。如果有,立刻递归建树作为左子树。因为有左子树就一定有右子树原创 2015-03-26 11:06:17 · 1637 阅读 · 0 评论 -
UVa #11082 Matrix Decompressing (例题11-8)
Run Time: 0.029s#define UVa "LT11-8.11082.cpp" //Matrix Decompressingchar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#include#include#include#includeusing namespace std;原创 2015-03-27 16:04:12 · 697 阅读 · 0 评论 -
UVa #10285 Longest Run on a Snowboard (习题9-1)
第七章的熟悉的味道,加上第九章一开始的嵌套正方形因为终点不固定,似乎不方便递推最后求所有出发点的dp值的最大值。Run Time: 0.022s#define UVa "9-1.10285.cpp" //Longest Run on a Snowboardchar fileIn[30] = UVa, fileOut[30] = UVa;#i原创 2015-03-06 11:35:27 · 524 阅读 · 0 评论 -
UVa #242 Stamps and Envelope Size (习题9-5)
这动态规划简直就是个暴力法。另外这数据规模也太友善了我的做法是设 dp(i,j) 为用第 i 套邮票拼凑出 j 分钱所需要的邮票数量,递推+刷表法。遇到dp值大于S或未定义的,则可以确定此套邮票最大coverage为 j-1要留意下output格式,在题目中没说,但是在sample output中能看出来制表的痕迹。这道题惨淡的数据、大量的PE估计很多都来源于此。原创 2015-03-08 12:11:16 · 1090 阅读 · 0 评论 -
UVa #10723 Cyborg Genes (习题9-6)
最长公共子序列模型。不同的解出现于d[i-1][j] == d[i][j-1]Run TIme: 0.009s#define UVa "9-6.10723.cpp" //Cyborg Genes#include#include#include#include#includeusing namespace std;int main()原创 2015-03-16 21:02:07 · 640 阅读 · 0 评论 -
UVa #1629 Cake slicing (习题9-3)
预处理保存下以(0,0)为左上角、(r, c)为右下角的矩形内梅子的个数,则以(r1,c1)为左上角、(r2,c2)为右下角的大矩形内梅子的个数为cnt[r2][c2] - cnt[r1-1][c2] - cnt[r2][c1-1] + cnt[r1-1][c1-1],注意边界。预处理复杂度为O(n),n为矩形格子总数。则可以在O(1)内判断某个区域内还有几个梅子。状态和状态转移方程都原创 2015-03-08 00:14:39 · 830 阅读 · 0 评论