- 博客(20)
- 资源 (1)
- 收藏
- 关注
原创 099_二分图判定
只允许使用两种颜色,对图进行着色,相邻点的颜色一定要不同,问是否能成功。 比较经典的邻接表图算法。 用dfs来实现。对于每一个节点的邻接节点,依次进行dfs染色,若有一个染色失败(两个点颜色相同),就返回失败 对所有点循环过后,若没有失败,就返回成功。 例子里面的表来自《挑战程序竞赛》第二版98页。//// 099_binary garph.cpp// changl
2015-12-31 16:25:29 316
原创 088_食物链问题(并查集)
食物链问题:有N个动物,每个动物只能为A,B,C三种动物中的一种,已知 A吃B, B吃C, C吃A。 现在给出K条信息,每条信息值可能为以下两种中的一种: 1. x,y属于同一种动物; 2. x吃y。 要求找出这K 条信息中不正确的条数。 题源来自《挑战程序竞赛》第二版88页。 此题使用并查集来实现应该比较方便。 先初始化并查集,对于每一个动物x,创建三个元素:x,x+N,
2015-12-31 06:56:36 407
原创 STL set 与 map 实例
set://// 081_STL set.cpp// changlle//// Created by user on 12/30/15.// Copyright (c) 2015 user. All rights reserved.//#include #include using namespace std;int main () { se
2015-12-30 15:14:29 293
原创 077_木板切割问题(优先队列)
木板切割问题的优先队列实现方式。 在c++中,首先要定义一个从小到达的优先队列,参见c++代码。//// 077_fence repair(pq).cpp// changlle//// Created by user on 12/30/15.// Copyright (c) 2015 user. All rights reserved.//#include
2015-12-30 14:12:38 1997
原创 074_加油站问题(优先队列)
加油站问题,一辆车在每个加油站可以加一定数量的油,邮箱容量没有上限,走一个单位的路程消耗一个单位的油量,问汽车是否能够到达终点,如果可以,最少加几次油? 从这个角度思考问题较方便: 当汽车经过某个加油站时,只把油装在车上,并不加入油箱。等到油箱为空时再加油,与在加油站加油的效果一致。(《挑战程序竞赛》第二版的说法为获得一次加油的机会) 所以当油箱用尽时,选择最大的那桶油来加
2015-12-30 13:23:34 901
原创 068_多重集组合数
有n种物品, 第i只能怪物品有a[i]个。不同种类的 物品可以相互区分,但同一种类的物品无法相互区分,从中取出m个的话,求取的方案数。 题源来自《挑战程序竞赛》第二版 68页。 根据其定义,有如下DP数组: dp[i+1][j]=从前i个物品中取出j个的组合数。 为了从前i个物品中取出j个,可以这样实现:从前i-1种物品取出j-k种,再从第i种物品中取出k个,所以,有以下递推式:
2015-12-30 07:39:12 348
原创 067_划分数
有n个无差别物品,划分成不超过m组,求划分的方案个数。 此类DP 问题定义如下: dp[i][j]=j个物品的i划分的总数。 DP的时候分两部分讨论:如果划分没有某一组是空的,即正好划分成i组,所以每组至少可以拿出一个物品,即为dp[i][j-i]。 或者至少有一组是空的,即其划分数为dp[i-1][j]; so, dp[i][j]=dp[i][j-i]+dp[i
2015-12-29 17:40:12 274
原创 065_最长递增子序列
最长递增子序列,经典问题,有别于最长子序列问题,元素必须递增。 cse531 mid2的时候考过的问题,要求n^2, 某人做了个半对还沾沾自喜.........弱爆了。 这里给出nlogn的解法,《挑战程序竞赛》书中实例代码相当简洁优雅,三行搞定。 以下po c++ 代码。 //// 065_lasc.cpp// changlle//// Created by us
2015-12-29 16:37:32 462
原创 063_多重部分和问题(DP)
多重部分和问题:给定一组数,并且给定期中每个数出现的次数,试问是否存在这样的组合,使其和为一个值K?(某个数可以取多次,但不能超过其次数) 如:a={3,5,8} m={3,2,2} K=17; 即 数字3有3个,数字5有2个,数字8有2个。是否存在和为17的组合? 就此情况而言,存在3*3+8=17
2015-12-29 09:51:07 373
原创 061_改变DP对象的01背包问题
经典的01背包问题有时候遇到允许重量过大时会遇到问题。以重量为对象来进行DP会导致运行时间过长。 解决方案是更换DP的对象,当总价值较小时可以以此为对象进行DP,具体如下: dp[i+1][j]=min(dp[i][j],dp[i][j-v(i)]+w(i)) 即寻找价值一定时的重量的最小值。 此处需要注意的问题是初始化: 1. 为了使DP顺利进行,在总价值无法
2015-12-28 16:31:41 239
原创 057_完全背包问题(DP)
完全背包问题,不同于01背包问题,每个物品有无限个可以取。 一般会想到在双层循环的条件下再增加一层循环k,来获得重量为j的情况下,只用前i个物品的价值的最大值。 然而在计算时,并不需要惊醒k循环,因为在计算dp[i][j]时,dp[i][j-w(i)]已经计算过了,所以必有: dp[i][j]=max(dp[i-1][j], dp[i][j
2015-12-27 15:35:43 299
原创 056_最长公共子序列
最长公共子序列问题,上完cse531还写不出来,要去面壁了。//// 056_longest subsequence.cpp// changlle//// Created by user on 12/27/15.// Copyright (c) 2015 user. All rights reserved.//#include #include
2015-12-27 15:18:15 217
原创 051_01背包(DP)
01背包~~~~~不多说了~ //// 051_01 knap sack.cpp// changlle//// Created by user on 12/27/15.// Copyright (c) 2015 user. All rights reserved.//#include #include using namespace std;in
2015-12-27 14:57:34 208
原创 047_木板切割问题(fence repair) poj 3253
又是一个贪心问题。 这里使用数组遍历来找到第一小与第二小的木板。后续会给出优先队列的实现方式。//// 047_fence repair.cpp// changlle//// Created by user on 12/26/15.// Copyright (c) 2015 user. All rights reserved.//#include #inc
2015-12-27 10:53:01 835
原创 045_saruman's aramy (区间覆盖问题)POJ 3069
给定区间的半径,要求在给定的点集中选择某些点,作为中间点来覆盖左右两边的点。 要求所用的点的个数最少。 贪心算法实现。 题源来自《挑战程序竞赛》第二版 45页。//// 045_saruman's aramy.cpp// changlle//// Created by user on 12/26/15.// Copyright (c) 201
2015-12-27 10:47:06 237
原创 043_字典序最小问题(best cow line)
poj 3617 从一个字符串s中头部或者尾部取同一个字符,加到字符串T中,要求字符串T的字典序最小。 对s和s的逆序s'进行比较。如果一样再对下一对进行比较,保证较小的字母较早被访问。 题源来自《挑战程序竞赛》第二版 43页。//// 043_best cow line.cpp// changlle//// Created by user on 12/
2015-12-27 10:40:01 275
原创 040_区间调度(贪心)
经典的贪心算法的例子。算法导论里面有讲。同样用c++的pair类型与sort实现效率较高。题源来自《挑战程序竞赛》第二版40页。//// 040_interval.cpp// changlle//// Created by user on 12/26/15.// Copyright (c) 2015 user. All rights reserved.//#incl
2015-12-27 10:35:53 368
原创 039_硬币问题(贪心)
入门级的贪心算法实现。不得不说书上的示例代码真心简介。题源同样来自《挑战程序竞赛》39页。//// 039_coin.cpp// changlle//// Created by user on 12/25/15.// Copyright (c) 2015 user. All rights reserved.//#include using namespace st
2015-12-27 10:31:09 293
原创 035_迷宫最短路径
经典的BFS问题, 貌似amazon有道题和这个挺像的~~参见《挑战程序竞赛》第二版34页。 用队列实现比较方便。依旧XCODE 蛋疼中。废话不多说了,直接po c++代码。//// 035_bfs.cpp// changlle//// Created by user on 12/24/15.// Copyright (c) 2015 user. All rights r
2015-12-27 10:06:03 395 1
原创 032_池塘问题(lake counting)
经典的DFS问题,参见《挑战程序竞赛》第二版 32页。只需注意每次对一个 'W' 做完DFS后,将其替换成'.',保证不会重复搜索。个人感觉可以用另一个数组记录访问过的原数组的位置,进一步加快速度。不多说了,上代码,用蛋疼的XCODE写的。//// 033_water_counting.cpp// changlle//// Created by user on 12/22
2015-12-27 09:54:18 366
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人