算法
Aegeaner
这个作者很懒,什么都没留下…
展开
-
一般图搜索算法
/*节点深度:根节点指示初始状态,令其节点深度为0,其他节点的深度d(n)地规定以为d(n)=d(n-1)+1路径:要求是无环的节点扩展:应用操作符将上一状态(节点ni)转移到下一状态(节点nj),nj为被扩展节点,且为ni的子节点OPEN表:用于存放刚生成的节点,它们尚原创 2011-09-06 09:37:59 · 3965 阅读 · 0 评论 -
【动态规划】每对顶点之间的最短路径之Floyd-Warshall算法
《算法导论》25.2. 《计算机算法(C++版)》5.3.当然这个算法的实现是相当简单的,只使用了三重循环,时间复杂度为O(n^3)。但是重点是算法背后的思想,一般教材都把这个算法当做典型的图算法来讲,却没有讲到背后动态规划的思想。不过《计算机算法(C++版)》做到了这一点。此题的最优子结构很明显,假设i到j的最短路径是d,那么明显对路径上的任一点k,有d、d都是最短路径。但是这样的子问题很难原创 2012-04-13 17:02:21 · 2728 阅读 · 1 评论 -
一道腾讯笔试题的思路
受到w397090770博文的启发,写一下此题的思路(原文只有代码)。原博文地址:http://blog.csdn.net/w397090770/article/details/7449309已知数组a[n],求数组b[n].要求:b[i]=a[0]*a[1]*……*a[n-1]/a[i],不能用除法。 a.时间复杂度O(n),空间复杂度O(1)。 b.除了迭代器i,不允许使用任何其它原创 2012-04-13 14:01:48 · 1134 阅读 · 0 评论 -
【动态规划】多部图问题代码
《计算机算法(C++版)》5.2.用前向算法和后向算法进行动态规划,前向算法从后往前递推;后向算法,从前往后递推。C++代码如下:#include #include #include using namespace std;class Graph{private: const static int MAXSIZE = 101; int VertexNum; in原创 2012-04-12 21:32:36 · 1310 阅读 · 0 评论 -
【动态规划】最长递增子序列代码(UVA 10131)
题目:http://uva.onlinejudge.org/index.php?option=onlinejudge&Itemid=8&page=show_problem&problem=1072先按大象的体重排序,然后用DP求出大象IQ的最长递减子序列。为了输出这个子序列,每次子序列扩容时使用一个Pre[]数组保存前一个元素的索引,将索引压栈后正序输出。#include #incl原创 2012-04-11 22:05:16 · 1319 阅读 · 0 评论 -
【动态规划】装配线调度代码
CLRS第二版15.1:#include int f[2][101];int l[2][101];int ff;int ll;void fastest_way(int n, int a[2][n], int t[2][n-1], int e[2], int x[2]){ f[0][0] = a[0][0] + e[0]; f[1][0] = a[1][0]原创 2012-04-11 13:45:21 · 980 阅读 · 0 评论 -
【动态规划】矩阵链乘法代码
CLRS 15.2#include #include #include int m[101][101];int s[101][101];void matrix_chain_order(int p[], int n){ for(int i=1; i<=n; i++) m[i][i] = 0; for(int l=2; l<=n; l++)原创 2012-04-11 16:53:54 · 1133 阅读 · 0 评论 -
统计整数二进制表示中1的个数
这是一个很有意思的问题,也是在面试中最容易被问到的问题之一。这个问题有个正式的名字叫Hamming_weight,而且wikipedia上也提供了很好的位运算解决的方法,这个下面也会提到。解决这个问题的第一想法是一位一位的观察,判断是否为1,是则计数器加一,否则跳到下一位,于是很容易有这样的程序。int test(int n){int count=0;while转载 2012-03-03 20:04:57 · 4662 阅读 · 0 评论 -
由二叉树的前序遍历序列和中序遍历序列求后序遍历序列
给出二叉树的前序遍历序列和中序遍历序列,求后序遍历序列。比如节点内存储的数据类型为char的二叉树,给出前序遍历序列"abdec",中序遍历序列"dbeac",则输出后序遍历序列。可以写一个递归函数实现,首先由前序遍历序列的第一个元素确定根节点,然后再中序遍历序列中找出等于该元素的位置索引,则根据中序遍历的定义,该位置以左为左子树,以右为右子树。根据前序遍历的定义,第一个元素之后跟着的也分别是原创 2012-02-24 10:04:27 · 10360 阅读 · 0 评论 -
POJ 1276
多重背包问题。状态转移方程:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0复杂度是O(V*Σn[i])。#include #include using namespace std;inline int Max(int原创 2011-08-30 12:47:52 · 627 阅读 · 0 评论 -
动态规划初步学习笔记
一、和分治法、贪心法的比较分治法中各子问题是相互独立的,即它们不包含公共子问题。贪心法的当前选择不能依赖将来所作的选择和子问题的解。它们的不足是:如果各子问题不是相互独立的,则分治法会重复求解公共子问题;如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略求得全局最优原创 2011-08-24 10:37:01 · 908 阅读 · 0 评论 -
通用哈希算法
unsigned int RSHash(char* str, unsigned int len){ unsigned int b = 378551; unsigned int a = 63689; unsigned int hash = 0;转载 2011-08-23 11:40:24 · 2406 阅读 · 0 评论 -
回转顺序打印矩阵的改进算法
原题目见:http://blog.csdn.net/aegeaner/article/details/6744011如果使用二维数组,空间复杂度为O(N^2),事实上本题可以计算A[i][j]的通项公式,这样可以不用额外的矩阵存储空间,空间复杂度降为O(1)。思想是考虑从左上角开始的i*i子矩阵,只要在子矩阵扩张的外围补充(i*i+1)~(i+1)*(i+1)的序列即可。又可以看做是(i+原创 2012-04-26 18:20:58 · 1431 阅读 · 0 评论