- 博客(90)
- 收藏
- 关注
转载 【转】用GDB调试程序(一)
原文章:http://blog.csdn.net/haoel/article/details/2879用GDB调试程序作者:haoel@csdnGDB概述————GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工
2015-06-02 11:17:34 749
原创 Leetcode #15 3 Sum
原题:Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.Note:Elements in a triplet (a,b,c
2015-04-27 12:50:35 664
原创 POJ #1018 Communication System
简单dp题,0-1背包模型。定义d[i][j]表示考虑完前i个设备,最大bandwidth为j时的最小费用。bandwidth的范围题目中没说,但貌似不大(500以内)#define UVa "poj-1018.cpp" //Communication Systemchar fileIn[30] = UVa, fileOut[30] = UVa;#include#inclu
2015-04-21 13:34:34 742
原创 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 847
原创 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 965
原创 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 953
原创 UVa #1349 Optimal Bus Route Design (例题11-10)
这道题作为一道regional,最值得学习的应该是问题的等价转换。把“找出几个圈,使得所有的点都只存在于一个圈内”,转换为“给每个点找一个孩子,使得一个点只有一个父亲”。转换后的问题,就可以用二分图匹配来做了:每个点拆成两部分分别放在二分图的S和T,使得S到T的连线代表儿子-父亲的关系。之后再求二分图的带权值的完美匹配,则可以保证每个结点只有一个儿子、一个父亲的情况下,求出最小费用了。
2015-03-29 23:21:50 845
原创 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 615
原创 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 714
原创 UVa #753 A Plug for UNIX (例题11-7)
网络最大流问题。建图的时候,取一个起点s,与所有设备的接口连接;再取一个终点t,与所有插线板的接口连接,流量都设为1。注意这里可能在相同的点之间多次添加边(比如不同的设备有着相同的接口),不过不影响解,只不过可能会增加增广的次数,对效率有所影响。之后在转换器可以转换的接口之间连线,流量无限大。这样,求s到t之间的最大流,再用设备数量减去最大流的数量就是答案了。
2015-03-27 11:38:06 764
原创 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 641
原创 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 623
原创 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 697
原创 UVa #1151 Buy or Build (例题11-3)
套餐只有8个,可以暴力枚举。不过边太多,不能枚举套餐都求一遍最小生成树。其实只需要在一开始求出不包含套餐的最小生成树,把这些边记下来备用。之后枚举套餐的时候,先把套餐中的点全部加入并查集,然后在原最小生成树的基础上,再来求最小生成树就可以了。那些一开始就没有被加入最小生成树的边,到了暴力枚举又加入很多权值为0的边排在他们前面,就更加不会被包含到最小生成树中了。
2015-03-26 11:51:46 897
原创 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 731
原创 UVa #12096 The SetStack Computer (例题5-5)
这道题的思想在后面用到了几次,因此还是贴出来:这道题是一个编码问题,即将某种数据结构通过一定的方法转化为独特的整数。这样就可以用整数来进行操作,大大简化了程序。对于这道题中的集合来说,一个集合包含了0或多个集合,并且可能有多层嵌套,无法用STL的set来模拟。但是我们可以给每一种集合分配一个ID。比如我们给{}分配1,{{}}就可以表示成{1},我们给他分配2。{{},{}
2015-03-26 11:13:15 1351
原创 UVa #12219 Common Subexpression Elimination (例题11-1)
这题和普通的表达式树很像,但如果按照一般的做法(用L、R代表范围),会TLE,因为重复了太多无用的扫描这题树中的结点对应的子树都是二叉树,不存在只有一个儿子的情况。输入的字符串中也只有两种情况,结点名字后面紧跟一个左括号的,和不跟括号的。因此很容易判断一个结点是否为叶子结点:只要在原字符串中看他后面有没有紧跟着左括号就行了。如果有,立刻递归建树作为左子树。因为有左子树就一定有右子树
2015-03-26 11:06:17 1680
原创 UVa #1380 A Scheduling Problem (例题9-26)
居然一次就过了。。做了两天,泪流满面啊。不过代码跑得很慢。。有机会优化一下这道题想清楚了还是很简单的,但是一开始的思路不容易理顺。下面文中我的f和g与Rujia书中的定义相反,请注意区分。题目里说,把所有的无向边去掉之后,最终答案则一定是由剩下的有向边组成的最长路径长度k或者k+1。所以我们的工作就变成了:给无向边分配方向,使得最后得到的树里,最长路径长度是否可
2015-03-20 15:58:00 1343
原创 UVa #12170 Easy Climb (例题9-25)
每次的调整都要依赖于上一次的决策,因此是一个多阶段决策问题。设 dp(i,j) 表示将第i个山坡高度改为j,还需要修改前i-1个山坡,所需要的代价总合。然而 j 的可能性太多(d深入分析问题,发现如果前后两个山坡的高度已经固定了,那么当前山坡调整后的高度应该属于[ max(h[i-1], h[i+1])-d , min(h[i-1], h[i+1])+d ]。如
2015-03-18 17:19:58 916
原创 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 657
原创 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 949
原创 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 799
原创 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 1104 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 537
原创 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 1107
原创 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 848
原创 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 722
原创 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 541
原创 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 2115
原创 UVa #10618 Tango Tango Insurrection (例题9-18)
一开始偷懒没读原题,根据白书里的描述似懂非懂的做了,WA了还纳闷半天。最好还是先读原题啊,有些看似无用的句子会给很多有用的信息每个决策要受到几个因素的影响:1、当前时间 2、左脚位置 3、右脚位置 4、上一次动了哪只脚前三个因素比较intuitive。第4个因素来自题目中的叙述:如果这次动的脚和上次的不同,则只消耗1个能量。如果这次和上次动的是同一只脚,则分三种情况,分别对
2015-03-03 13:43:51 1157
原创 UVa #1627 Team them up! (例题9-19)
要求同一个队伍里的人互相认识,则一对互相不认识或者单方面认识的人必须被分到不同的队伍。根据后面这条规则进行分组会比较简单所以我们可以从一个人出发,递归寻找所有“存在着不互相认识”关系的人,形成一个图,再给这个图里的所有人加正反标记,保证相邻的人都有相反的标记。若存在相邻的人有着相同的标记,则输出无解。之后再根据正反标记,把他们放到相应的组里面。这样就把人分成了很多个连通块,
2015-03-02 16:42:37 1525 2
原创 UVa #1625 Color Length (例题9-8)
看到后面例题9-21也用了这题的方法,把这题补上这题:在放置颜色的时候,需要判断它是不是最后一个,然后需要找到这个颜色的开始位置。如果把每个颜色的开始位置记录在状态中,状态空间将会太大但是每次放置颜色,如果有 a 种颜色还没有结束,那么这 a 种颜色结束的时候,与初始位置的距离肯定要+1。每种颜色开始和结束的位置我们可以事先算出,因此我们可以在状态转移的时候判断当前还有多少
2015-02-27 15:15:10 802
原创 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 726
原创 UVa #1252 Twenty Questions (例题9-16)
2.5s低空飘过集合上的动态规划,中间状态一般就是全集的子集合。为了精确的描述状态,一般增加一个或多个维度。这道题全集就是所有的特征,中间状态就是询问了某一些特征。询问的结果则要用另一个维度来储存。动态规划的过程就是把所有可能的询问遍历一遍,在每次遍历的同时,遍历所有的询问结果的可能性。边界值及时返回、重叠子问题及时返回,避免重复运算。Run
2015-02-24 15:14:02 626
原创 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 547
原创 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 654
原创 UVa #1220 Party at Hali-Bula (例题9-13)
新年第一题,一道树上的动态规划,树的最大独立集问题。书中的介绍部分讲解了刷表法,却说有一种更实用的方法将在例题中介绍,应该说的就是这题。按照这种方法的思路,我们不必枚举所有儿子和所有孙子,只需要加一个维度来表示是否选中当前节点然后只枚举儿子。对于已经选中的节点,在记忆化搜索的递归时,将它所有儿子的这个维度设为“不选中”即可。对于不选中的节点,则对于每个儿子,
2015-02-23 14:26:46 1078
原创 UVa #12186 Another Crisis (例题9-12)
大家羊年新年快乐啊!这道题很适合年三十做,很涨自信。应该是马年做的最后一道题啦这道题其实真的跟动态规划有关系吗?虽然满足最优子结构,但并没有重叠子问题。因此只是一道普通的树的dfs而已。关于求最少人数的式子:(k*T - 1)/100 + 1k*T/100不需要解释。一个-1一个+1则起到了手动ceiling的功能。因为整数除法是自动floor,所以+1
2015-02-18 14:56:18 743
原创 UVa #1626 Brackets sequence (例题9-10)
动态规划的意味还是挺明显的:如果子结构A、B都ok,则AB也ok。如果Aok,则(A)、[A]也ok。那么对于一个序列,我们只要扫描他所有的子结构,取子结构中dp值最小的就好了。边界条件是1、单独一个元素,这时因为无法配对,一定要加上另外一半的括号,因此dp值为1;2、一对配好对的括号,dp值为0。打印解:再次用到了Ideal Path的方法。因为只用打印任意一组解,找到第
2015-02-17 18:28:02 616
原创 UVa #10003 Cutting Sticks (例题9-9)
9-8还没做完,感觉有点困难。回头再做这道题很好的训练了最优矩阵连乘。记忆化搜索TLE了,递推则很顺畅。递推的顺序:不能按照以前的方法递推,因为求某一个区间的解的时候要用到它子区间的解,如果按照以前的顺序递推,则子区间的解此时还没有求出来。所以先把长度为1的子区间的解求出来,这样就能求长度为2的子区间的解,然后就能求3、4...直到n+1Run Time
2015-02-17 16:42:49 739
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人