随笔分类 -  算法题

第二轮复习 包括 九度, POJ, Leetcode 一共100+ 题目, 时间 14/4/3 - 14/4/12
摘要:题意:所给数据中是否有负环? 没有负环的图中所有路径中最短的值思路:1. bellmanford 判断负环2.flodyWarshall 求所有定点的最短路径细节:1. bellmanford 算法时间复杂度为 o(n^3), 因为图的使用邻接矩阵存储的, 使用邻接表代码会容易理解些, 引用 wik... 阅读全文
posted @ 2014-05-29 06:50 周卓 阅读(421) 评论(0) 推荐(0)
摘要:题意:computing a max-spacingk-clustering.spacing 是指两个 cluster 之间的最小距离输入:[number_of_nodes][edge 1 node 1] [edge 1 node 2] [edge 1 cost][edge 2 node 1] [e... 阅读全文
posted @ 2014-05-29 06:39 周卓 阅读(535) 评论(0) 推荐(0)
摘要:题目1 : Arithmetic Expression 描述Given N arithmetic expressions, can you tell whose result is closest to 9? 输入Line 1: N (1 c/d a*d > b*c.因此我们将所有的数都表示成 abs(divided/divisor -9) 的形式. 比如 901 / 100 -> 1/100; 3*3 -> 0/1; 2+6 -> 1/1; 8 - -1 = 0/1;这样就不会有小数的问题了.#include #include #include #include #i 阅读全文
posted @ 2014-04-12 10:11 周卓 阅读(260) 评论(0) 推荐(0)
摘要:总结1. 坐标的确定2. 有了坐标公式, 下一步就好做了使用 DFS 查找 left hand, right hand 最短路. BFS 全局最短路 阅读全文
posted @ 2014-04-08 17:06 周卓 阅读(127) 评论(0) 推荐(0)
摘要:这里给出了 Bellmanford 和 SPFA 的算法思想和伪代码, 但这离具体的实现还有差距, 最短路径算法的使用频率很高, 有必要总结一下1. SPFA 算法算法的核心是: 松弛有效的操作必然发生在松弛前导节点成功松弛的节点上/* * spfa.h * * Created on: Apr 8... 阅读全文
posted @ 2014-04-08 15:39 周卓 阅读(263) 评论(0) 推荐(0)
摘要:总结1. 这里 dp[][][] 不是恰好走 k 步, 而是最多走 k 步. 恰好和最多的区别就在于 dp 数组的初始化上了代码/* * source.cpp * * Created on: Apr 7, 2014 * Author: sangs */#include #include #include #include #include #include #include using namespace std;int val[1000];int dp[500][500][2];vector graph[1000];/* * dp[u][t][0] start from u an... 阅读全文
posted @ 2014-04-08 14:42 周卓 阅读(162) 评论(0) 推荐(0)
摘要:总结1. dp[u][k] 是恰好用完 k 时间的最大价值2. dfs(u, pre, vmax) 是计算 dp[u][1...vmax] 的值3. dfs 内部遍历, j 从大到小, 防止重复计算 f(j) = g(j-k)而 k 是从小到大, 因为在 134 行, dp[j] = max(dp[j], dp[j-k]+dp'[k]) 比较特殊, k 可以等于 0. 导致 dp[j] 被重复计算代码/* * source.cpp * * Created on: Apr 6, 2014 * Author: sangs */#include #include #include #in.. 阅读全文
posted @ 2014-04-08 11:55 周卓 阅读(156) 评论(0) 推荐(0)
摘要:题目描述总结1. 这种状态转移的题目不太好 debug, 写起来总觉得不对劲2. 动规的初始化总能找到一些简练的初始化方法, 比如这道题, 可以选择 j>=0, dp[0] = 1, 或者对 vector 中的所有元素赋值 dp[s] = 1, 然后 j > 0代码 TLE 了/* * source.cpp * * Created on: Apr 6, 2014 * Author: sangs */#include #include #include #include #include #include #include using namespace std;int arr[10 阅读全文
posted @ 2014-04-06 23:10 周卓 阅读(180) 评论(0) 推荐(0)
摘要:题目描述总结1. 编程之美讲了剪枝解法, 这里给出动规解法2. dp[i][j]%n = j. dp[i][j] 是 mod n 余 j 的最小值代码/* * source.cpp * * Created on: Apr 6, 2014 * Author: sangs */#include #include #include #include #include using namespace std;typedef unsigned long long LL;LL dp[200][500];LL cal(int n) { LL lastModed = 1; LL expr10 = ... 阅读全文
posted @ 2014-04-06 20:42 周卓 阅读(268) 评论(0) 推荐(0)
摘要:题目描述总结1. 枚举 i 是未被取到的价值最小的酒, 那么 0~i-1 都取到了, 对 i+1~end 运行 01 背包代码 有些极端 case 没考虑到/* * source.cpp * * Created on: Apr 6, 2014 * Author: sangs */#include #include #include #include #include #include using namespace std;int arr[100];int dp[2000];int cal(int n, int target) { int res = 0; int sum = 0;... 阅读全文
posted @ 2014-04-06 19:25 周卓 阅读(184) 评论(0) 推荐(0)
摘要:题目描述总结1. 完全背包框架都想了半天2. 我随机取了个背包的上限, 超时了代码 超时/* * source.cpp * * Created on: Apr 6, 2014 * Author: sangs */#include #include #include #include #include using namespace std;const int INF = 0X3F3F3F3F;const int MAXMONEY = 50000;int val[2000];int num[2000];int dp[MAXMONEY+100];void firstPass(int n... 阅读全文
posted @ 2014-04-06 16:14 周卓 阅读(142) 评论(0) 推荐(0)
摘要:题目描述总结1. 偏移的设置又思考了很久, 实际上, 枚举几个例子就能把思路找出来2. dp[i][j], 循环的最外两层循环分别是 i, j3. 初始化问题, dp[i][j] 初始化成 0 更好, 下面的代码写的很丑, 就是因为初始化没搞好. 做题时若实在拿捏不准到底初始化成 0, 1 还是 INF, 那就都试试代码/* * source.cpp * * Created on: Apr 5, 2014 * Author: sangs */#include #include #include #include #include using namespace std;const ... 阅读全文
posted @ 2014-04-06 15:22 周卓 阅读(134) 评论(0) 推荐(0)
摘要:DescriptionSummary:1. Fill dp array explicitly by using dp[i] = dp[i+1]2. At time i, do the first job explicitlyCode:/* * source.cpp * * Created on: Apr 5, 2014 * Author: sangs */#include #include #include #include #include using namespace std;class Job {public: int st, ed, duration; Job(int _... 阅读全文
posted @ 2014-04-05 22:28 周卓 阅读(215) 评论(0) 推荐(0)
摘要:题目描述总结1. 两遍 BFS. 第一遍给图的点标记上序号, 第二遍BFS, 只走向序号较小的孩子节点2. 迷糊了, 一个无权图, 还用了 dijkstra 算法 阅读全文
posted @ 2014-04-05 18:50 周卓 阅读(206) 评论(0) 推荐(0)
摘要:题目描述总结1. 可以使用记忆化DP, 也可以直接用循环2. 关于板子重叠的情况. 不需要考虑板子重叠的情况. 假如 board1, board2 之间的高度差大于限定, 那么不能完成降落, 或者不能直接完成降落. 阅读全文
posted @ 2014-04-05 17:13 周卓 阅读(103) 评论(0) 推荐(0)
摘要:题目描述总结1. [i~j] 之间建立一个邮局, 位置是 (i+j+1)/22. 初始化, 尽可能少的初始化代码/* * source.cpp * * Created on: 2014-4-5 * Author: vincent */#include #include #include #include using namespace std;const int NUM = 310;const int INF = 0X3F3F3F3F;int arr[10010];int dist[NUM][NUM];int dp[NUM][31];void init(int n) { for(i... 阅读全文
posted @ 2014-04-05 11:33 周卓 阅读(156) 评论(0) 推荐(0)
摘要:题目描述总结1. DFS 使用 dfs(u, v) 框架可以省去 visited[]; 还可以添加一个辅助的 dummy 头结点2. 需要 long long 类型才可以3. 题目本身比较简单, DFS 后序遍历, 树形 DP 的最简单题型代码 数据类型有误/* * source.cpp * * Created on: 2014-4-5 * Author: vincent */#include #include #include #include #include #include #include #include #include using namespace std;con... 阅读全文
posted @ 2014-04-05 10:49 周卓 阅读(159) 评论(0) 推荐(0)
摘要:题目描述总结1. dp[i][j] 第二个变量 j 的设置. j 可以设置成 Money, 也可以是带宽. 分别写一下状态转移方法会发现 j 是带宽时简单些, 并且带宽枚举量少一下2. dp[i][j] = min(dp[i][j], price[i][k]+dp[i-1][j]) for all k that bw[i][k] >= j代码 WA. discuss 的测试数据都通过了, 可能是 dp[-1] 的问题, 以后再改吧/* * source.cpp * * Created on: 2014-4-5 * Author: vincent *//* * dp[i][j] 前 ... 阅读全文
posted @ 2014-04-05 09:48 周卓 阅读(169) 评论(0) 推荐(0)
摘要:题目描述总结1. 和 Leetcode Palindrome cut 的设置方法类似2. 时间复杂度为 o(n^2), n 为任务个数3. 为了优化空间复杂度(同时也优化时间复杂度), dp[i] 表示第 i 个任务的开始时间到 endTime 之间能够获得的最大收益代码/* * source.cpp * * Created on: 2014-4-4 * Author: vincent */#include #include #include #include using namespace std;/* * dp[i] ~ time[i-endtime] 能够获得的最大收益 * ... 阅读全文
posted @ 2014-04-04 22:56 周卓 阅读(206) 评论(0) 推荐(0)
摘要:题目描述总结:1. dp[i][0] 第 i 个位置上座男生方案数, dp[i][1] 第 i 个位置上座女生方案数2. dp[i][0] = dp[i-1][0] + dp[i-1][1], straight forward3. dp[i][0] = dp[i-2][0] + dp[i-3][0] +... dp[0][0] 枚举第一个男生出现的位置, 出现该男生之前的位子上座的都是女生代码/* * source.cpp * * Created on: 2014-4-4 * Author: vincent */#include #include #include using na... 阅读全文
posted @ 2014-04-04 21:12 周卓 阅读(350) 评论(0) 推荐(0)