2011年5月8日
摘要: #include<iostream>using namespace std;const int HEAP_SIZE = 100;void sink(int fa);void swim(int son);int heap[HEAP_SIZE+1];int hs;//以建立最小堆为例/*****************************************************************///删除堆顶元素 ,利用上游函数调整/*删除最小值(deleteMin) 先用最后一个元素代替根由于这一步会导致根的元素比儿子大,因此需要向下调整。向下调整的方法很简单,就是 阅读全文
posted @ 2011-05-08 17:58 geeker 阅读(1520) 评论(2) 推荐(1) 编辑
  2011年5月6日
摘要: 《图的表示方法》(i)邻接矩阵表示法,如图: 也就是说,如果两节点之间有一条弧,则邻接矩阵中对应的元素为1;否则为0。可以看出,这种表示法非常简单、直接。但是,在邻接矩阵的所有 个元素中,只有 个为非零元。如果网络比较稀疏,这种表示法浪费大量的存储空间,从而增加了在网络中查找弧的时间。 同样,对于网络中的权,也可以用类似邻接矩阵的 矩阵表示。只是此时一条弧所对应的元素不再是1,而是相应的权而已。如果网络中每条弧赋有多种权,则可以用多个矩阵表示这些权。(ii)关联矩阵表示法 也就是说,在关联矩阵中,每行对应于图的一个节点,每列对应于图的一条弧。如果一个节点是一条弧的起点,则关联矩阵中对应的元素为 阅读全文
posted @ 2011-05-06 21:11 geeker 阅读(11237) 评论(3) 推荐(10) 编辑
摘要: 《栈》栈的实现栈只能在一头进行操作,相对比较容易实现。用一个数组int stack[]和栈顶指针top即可,插入和删除(也称push和pop)栈的实现代码://用一个数组int stack[]和栈顶指针top即可实现//top指向栈顶元素(即栈顶元素的坐标)//这里逻辑上的“顶”实际上为无理数组上的“尾”部;1 stack[++top ] = x ; /¤ push ¤/2 x = s tack [ top ¡¡]; /¤ pop ¤/对物理实现和逻辑实现的理解:和链表删除类似,出栈时并不需要让stack[top]变为0。由于top已 阅读全文
posted @ 2011-05-06 20:24 geeker 阅读(351) 评论(0) 推荐(0) 编辑
  2011年5月5日
摘要: http://poj.org/problem?id=1738这题貌似是用DP可以搭,但是数据给的那么大,就不行了,写了个DP算法结果过不了,泪奔,哪位高手给指点下哦~~~而且根本就开不了50000*50000的数组啊,怎么办啊!!!#include<iostream>using namespace std;const int MAX = 50001;int dp[MAX][MAX];int piles[MAX];int n;int DP(int i,int j){ if(i==j){ dp[i][j]=0; return 0; } if(dp[i][j]) return dp[i] 阅读全文
posted @ 2011-05-05 19:02 geeker 阅读(490) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2673题目描述:一个人有t秒时间,每秒能干x量的工作。有m只动物,开始时,第i只动物离人有di的距离,它的速度是si每秒。只要人干活,动物就朝人走,如果不干活,动物就原路返回。要求动物不能达到人,问人最多能干多少工作。解题报告:首先得到最先到达人的动物的时间,记下这个时间减一记作re,所以人第一次停止工作是在re 1秒的时候。所以,如果re == 0,工作量只能是0.如果re >= t,那人就不用停止工作,工作量最大:t * x。最后,re < t,首先人能工作re的时间,剩下的时间可以认为休息1秒(同时动物往回跑一秒),然后工 阅读全文
posted @ 2011-05-05 15:49 geeker 阅读(203) 评论(0) 推荐(0) 编辑
  2011年5月4日
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2717从N到K,N可以N+1,N-1,N*2这三种方式前进,找到K为止!至少需要多少次前进!题目挺水的,一刻钟敲完后,测试啊数据都正确,MD总是报Runtime Error(ACCESS_VIOLATION)这是什么鸟啊???看了别人的报告后,发现自己的BFS写的如此之烂... ...#include<iostream>#include<algorithm>using namespace std;#include<queue>const int MAX = 200001;i 阅读全文
posted @ 2011-05-04 19:49 geeker 阅读(364) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1579很水的一道小题儿,一开始算dp[][][]的时候顺序随便按照i,j,k一次递增的顺序进行,后来发现不可以~而且每一个dp到底需要哪些之前的dp也不是很容易看出来,还是用递归的顺序加上记忆搜索就简化许多一开始的错误代码 :#include<iostream>using namespace std;int dp[21][21][21];int main(){ for(int i=0;i<=20;i++) for(int j=0;j<=20;j++) dp[0][i][j]=dp[i][0][j]=dp[i][j][ 阅读全文
posted @ 2011-05-04 01:47 geeker 阅读(179) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1887题目很基础,就是求 最长减子数列dp[i]=max{ max{dp[j]+1(arr[i]<arr[j] ; 1<=j<i )} , 1 }#include<iostream>using namespace std;const int MAX = 100000;int index;int dp[MAX];int arr[MAX];int main(){ int cin1; int t=1; while(scanf("%d",&cin1)&&cin1!=-1){ 阅读全文
posted @ 2011-05-04 00:57 geeker 阅读(293) 评论(0) 推荐(0) 编辑
  2011年5月3日
摘要: http://poj.org/problem?id=1953用n个数字0或者1组成一个排列,要求每两个1不相邻,问有多少种排法dp[n][0]记录n个连续数,结尾为0的不同排列数dp[n][1]记录第n个连续数,结尾为1的不同排列数DP公式:dp[i][0]=dp[i-1][0]+dp[i-1][1];dp[i][1]=dp[i-1][0];#include<iostream>using namespace std;//dp[i][0]记录第i个连续数,结尾为0的个数//dp[i][1]记录第i个连续数,结尾为1的个数int dp[50][2];int main(){ dp[1][ 阅读全文
posted @ 2011-05-03 22:43 geeker 阅读(424) 评论(0) 推荐(0) 编辑
  2011年5月2日
摘要: 1、首先考虑一维的最大子段和问题,给出一个序列a[0],a[1],a[2]...a[n],求出连续的一段,使其总和最大。a[i]表示第i个元素dp[i]表示以a[i]结尾的最大子段和dp[i] = max{a[i], dp[i-1] + a[i]}解释一下方程:如果dp[i-1] > 0,则 dp[i] = dp[i-1] + a[i]如果dp[i-1] < 0,则 dp[i] = a[i]因为不用记录位置信息,所以dp[]可以用一个变量dp代替:如果dp > 0,则dp += a[i]如果dp < 0,则dp = a[i]2、考虑二维的最大子矩阵问题我们可以利用矩阵压 阅读全文
posted @ 2011-05-02 21:36 geeker 阅读(988) 评论(0) 推荐(0) 编辑