随笔分类 -  算法那些事儿~

算法数据结构,Acmer
摘要:太久没写代码了,今天看视频教程,谈到用非递归方法实现斐波那契数列,居然愣了一下,煞笔了……#includeint fab(int a) { if(a<=2)return 1; int pre = 0; int cur = 1; for(int i=2;i<=a;i++) { int temp = pre; pre = cur ; cur = temp + pre; } return cur;}int main(){ int a; //1 1 2 3 5 8 13 while(scanf("%d",&a)!=EOF){ printf("%d\n& 阅读全文
posted @ 2012-06-06 20:15 AndreMouche 阅读(366) 评论(0) 推荐(0)
摘要:1.插入排序算法导论第一部分,基础知识。P17 插入排序,复杂度O(n^2)View Code 1 #include 2 const int N = 100; 3 int a[N]; 4 5 /** 6 算法导论第一部分,基础知识。 7 P17 插入排序,复杂度O(n^2) 8 */ 9 void insertion_sort( int *a,int n)10 {11 for(int i = 1;i =0&&a[j]>key)16 {17 a[j+1]=a[j];18 j--;19 }20 ... 阅读全文
posted @ 2012-03-22 21:37 AndreMouche 阅读(256) 评论(0) 推荐(0)
摘要:ZOJ 3578 Matrixinput:第一行:N M C 后面C行:ai,bi,hi,xi,yiproblem:一个N*M的网格平面,开始时平面上所有网格值为0定义操作T(ai,bi,hi,xi,yi):1.挑选出网格矩阵[xi,yi,xi+ai,yi+bi]中的最大值max2.将网格矩阵[xi,yi,xi+ai,yi+bi]中的所有值赋为max+hi求C次操作后,网格矩阵N*M中的最大值数据范围N__27 #include28 const int N = 1000+10;29 class Matrix {30 public:31 int left,right;32 int... 阅读全文
posted @ 2012-03-07 20:51 AndreMouche 阅读(519) 评论(0) 推荐(0)
摘要:POJ 1201 Intervalshttp://poj.org/problem?id=1201问题概述: 提供n组ai,bi,ci,表示在区间[ai,bi]中最少的整数个数,求所有提供区间中所包含的最小整数个数转化: 用S[i]表示[0,i]区间内的整数个数,则 1.S[bi+1]-S[ai]>=ci 2.1>=S[i+1]-S[i]>=0 求:MIN(S[e]-S[s]); 思路:从不等式中易想到差分限制系统 即若a-b>=c,建立从b指向a的边,边的权重为c, 那么最终问题转化为从s到e的最长路,用SPFA即可View Code 1 #include 2 #inc 阅读全文
posted @ 2011-04-03 20:43 AndreMouche 阅读(855) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1511POJ 1511 Invitation Cards大意:求有向图中从源点到每个节点的往返距离和分析: 1.根据题意建立两幅图,分别对应于正向图和反向图 2.分别对正向图和反向图求从源点即题中的1结点出发求単源最短路径, 3. 由2易得,正向图中求得的dis[i]为s到i的最短路,反向图中求得的dis[i]为i到s的最短路 那么s到i的往返距离即为两个dis相加 4.在求単源最短路时用SPFA,两次SPFA即可完成 重点注意:需要读入的数据较大,使用getint()函数可大大减少读数据时间 View Code 1 #include .. 阅读全文
posted @ 2011-03-31 20:03 AndreMouche 阅读(488) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3259POJ 3259 Wormholes大意:给出由n个顶点组成的有向图所有边信息,判断该图中是否存在负回路分析: 由于不知道图中的负环路会包含哪些顶点,故自定义一源点s,对于每个顶点k,有一条s到k权值为0的有向边,此时便可初始化s到每个顶点的距离dis[k]为0,然后用Bellman-Ford计算从源点s到各点的単源最短路,若存在某条边有第n+1次松弛操作,则存在负环,否则没有负环重点注意:引出源点s的定义,并创建从s到每个点的单向边的目的是为更好地理解dis[i]的初值问题,当然,对于初值dis[]不一定要是0,也可以是其他任意数, 阅读全文
posted @ 2011-03-31 17:57 AndreMouche 阅读(457) 评论(0) 推荐(0)
摘要:再次感谢原作者的分享:http://hi.baidu.com/jzlikewei/blog/item/94db7950f96f995a1038c2cd.htmlBellman-Ford 算法及其优化Bellman-Ford算法与另一个非常著名的Dijkstra算法一样,用于求解单源点最短路径问题。Bellman-ford算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题(意义是什么,好好思考),而Dijkstra算法只能处理边权非负的问题,因此 Bellman-Ford算法的适用面要广泛一些。但是,原始的Bellman-Ford算法时间复杂度为 O(VE),比Dijkstra算法的时 阅读全文
posted @ 2011-03-29 15:02 AndreMouche 阅读(3918) 评论(0) 推荐(3)
摘要:POJ 1155 TELEhttp://poj.org/problem?id=1155大意:某电台要广播一场比赛,该电台网络是由N个网点组成的一棵树,其中M个点为客户端,其余点为转发站。客户端i愿支付的钱为pay[i],每一条边需要的花费固定,问电台在保证不亏损的情况下,最多能使多少个客户端接收到信息?广播台所在的节点编号为1分析:树形DP1.user[i].dp[j]表示从转发站i开始计算,满足其子树中j个顾客的最大报酬 分析节点i的孩子节点s a.放弃该孩子s,值不变 b.取该孩子的若干的节点:user[i].dp[j-k]+user[s].dp[k]-cost[i][j](cost[i] 阅读全文
posted @ 2011-03-26 10:52 AndreMouche 阅读(739) 评论(0) 推荐(0)
摘要:POJ 1947 Rebuilding Roadshttp://poj.org/problem?id=1947大意:有n个点组成一个树,问至少要删除多少条边才能获得一棵有p个结点的子树?分析:树形DP 满足上诉条件的子树必由某个结点和它的若干子树组成,1.用dp[i][j]表示结点i恰好保留j个子树时至少需要删除的边数,若结点i有子树s a.删除子树s,dp[i][j]+1 b.子树s保留k个结点:dp[s][k-1]+dp[i][j-k] 综上:dp[i][j] =min(dp[i][j]+1,dp[s][k-1]+dp[i][j-k])(0 2 #include 3 constint N 阅读全文
posted @ 2011-03-26 09:56 AndreMouche 阅读(861) 评论(0) 推荐(0)
摘要:POJ 3207 Ikki's Story IV - Panda's Trick大意:已知圆上均匀分布着n个点,编号按逆时针数分别为0,1,2,。。。n-1由上述点够成m条边,这些边可分布于圆内或圆外,问这些边有没有可能不相交?分析:2-SAT1.构图: 每条边可在圆内或圆外,对应于两个点,Ai,Ai'2.若边i与边j相交,a.若选择Ai边则必须选Aj'边,b.若选择Ai'边则必须选择Aj边,故对应于上图: 建立边(Ai,Aj'),(Ai',Aj)3.若存在边i,有Ai,Ai'属于同一个强连通分量,则一定会相交View Code 阅读全文
posted @ 2011-03-19 12:15 AndreMouche 阅读(540) 评论(0) 推荐(0)
摘要:昨天搜水题做,一不小心进一牛人的博客,看到几道二分题的报告,忍不住做了一下,顺便把人家对题目的描述偷懒过来,说我邪恶吧( ⊙ o ⊙ )!POJ 3258 River Hopscotchhttp://poj.org/problem?id=3258长为L的河道,起点在0位置,终点为L位置,期间分布着n块石头,石头不会重叠求拆掉其中的m块石头,使相邻两石头间的距离的最小值最大,并输出这个值。。。额。。。貌似描述不清。。。将就一下,(*^__^*) 嘻嘻……View Code #include#include#includeusingnamespace std;constint N =50000+1 阅读全文
posted @ 2011-03-13 19:55 AndreMouche 阅读(714) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2362POJ 2362 Sqare大意: 有n根木棒,长短不一,问能否使用所有的木棒摆出一个完整的正方形?分析:1.木棒的总长度整除42.DFSView Code #include#includeconstint N =22;int sticks[N];bool visited[N];int part;int n;//从start根木棒出发,在已经凑齐pnum条边,//第pnum+1条边已有pre长度的情况下,搜索是否存在满足答案的解bool search(int start,int pnum,int pre){ if(pnum==3&am 阅读全文
posted @ 2011-03-13 19:47 AndreMouche 阅读(458) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1077八数码问题:由1,2,3,4,5,6,7,8,x组成一个3*3的矩阵,如1 2 34 x 5 6 7 8其中x可与其上,下,左,右相邻的元素互换,现问从给出状态出发到达以下状态:1 2 3 4 5 67 8 x需要对x进行怎样的位移操作,输出x的最少位移信息,若状态不可达,输出unsolvable分析:1.一个很容易的想法,即BFS,2.用康托展开将每个状态转化为整数,即可略过已访问点3.再用优先队列加以优化4.其实可以用A*加以优化,f(x) = g(x)+h(x),h(x)为当前状态中x所在位置到右下角位置的哈密尔顿距离(不过实际 阅读全文
posted @ 2011-03-02 21:45 AndreMouche 阅读(1731) 评论(0) 推荐(0)
摘要:http://cs.scu.edu.cn/soj/problem.action?id=3843SCOJ 3843 ZUMA大意:有100种不同的颜色,编号为1,2,3。。100.从中取n颗珠子排成一条直线,已知将某颗珠子插入到某一位置,若与该珠子连续的相同颜色的珠子个数>=k,那么与这一连串相同颜色的珠子便可全部消去现要消去所有珠子,问至少需要多少珠子?分析:记忆化搜索、、、、、语言组织能力太差,说不太清。。。。囧o(╯□╰)o#include#includeconst int MAXN = 100+5;const int K = 5+1;int n,k;int a[MAXN];int 阅读全文
posted @ 2011-02-27 21:29 AndreMouche 阅读(4914) 评论(0) 推荐(0)
摘要:ZOJ 3209 Treasure Maphttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3372大意:已知有一张n*m的图,p个矩形,问至少需要多少个矩形能够完全覆盖整幅图, 要求不能出现重叠分析: 转化为精确铺盖问题,即将图拉成一条长度为n*m的链,在该图中找到每个矩形 对应的覆盖点,用DancingLink计算最少需要点数即可。。#include#includeconst int MAX_COLOUMN = 30*30+2;//最多出现列数const int MAX_ROW = 500+2;//最多出现的行数int c 阅读全文
posted @ 2011-02-27 10:28 AndreMouche 阅读(707) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2829HDU 2829 Lawrence大意: 有一条直线型的铁路,上面有n个火车站,每个火车站有各自的权重a[i], 现有m枚炮弹,每枚炮弹可炸毁一段铁路。 已知整条铁路的权重W = sum(a[i]*a[j]),其中火车站编号i#include#includeusing namespace std;const int N = 1000+5;int sum[N];int num[N];int cost[N][N];int s[N][N];int dp[N][N];int main(){ int n,m... 阅读全文
posted @ 2011-02-27 09:43 AndreMouche 阅读(589) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3076POJ 3076 Sudoku求解规模为16*16的数独问题,还是数独,呵呵,直接改了上题的代码就是了。。所以也不废话了,嘿嘿。。。#include#includeconst int MAX_COLOUMN = 16*16+16*16+16*16+16*16+2;//最多出现列数const int MAX_ROW = 16*16*16+2;//最多出现的列数int cnt[MAX_COLOUMN];//cnt[i]统计第i列1的个数int most,coloumn;bool ans[MAX_ROW];//ans存放最终选中的行//跳舞 阅读全文
posted @ 2011-02-24 21:29 AndreMouche 阅读(679) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2676POJ 2676 Sudoku也是求解规模为9*9的数独问题,与POJ 3074 Sudoku相同的问题,只是修改了输入输出格式而已。。。所以也不废话了,嘿嘿。。。#include#includeconst int MAX_COLOUMN = 81+9*9+9*9+9*9+2;//最多出现列数const int MAX_ROW = 81*9+2;//最多出现的列数int cnt[MAX_COLOUMN];//cnt[i]统计第i列1的个数int most,coloumn;bool ans[MAX_ROW];//ans存放最终选中的行/ 阅读全文
posted @ 2011-02-24 20:51 AndreMouche 阅读(555) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3074POJ 3074 Sudoku大意:求解规模为9*9的数独问题分析:对于每一行,每一列,每一宫,数字1,2。。。9都需出现1次且只能是一次,可转化为精确覆盖问题,用跳舞链解决建模型:行数为9*9*9,数独中,第i行j列放数字k的状态存储在图中第(i*9+j)*9+k行中列数为9*9+9*9+9*9+9*9,其中第一个9*9代表第i格是否已填满,用第二个9*9确保每行的数字唯一且均出现一次第三个9*9确保每列的数字唯一且出现一次第四个9*9确保每宫的数字唯一出现1次#include#includeconst int MAX_COLOUM 阅读全文
posted @ 2011-02-24 20:35 AndreMouche 阅读(1094) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3740POJ 3740 Easy Finding大意:精确覆盖问题:给定一个由0和1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个 1?分析:用跳舞链来解决该问题即可 跳舞链的核心: 如果A是空的,问题解决;成功终止。 否则,选择一个列c(确定的)。 选择一个行r,满足 A[r, c]=1 (不确定的) 把r包含进部分解。 对于所有满足 A[r,j]=1 的j, 从矩阵A中删除第j列; 对于所有满足 A[i,j]=1 的i, 从矩阵A中删除第i行。在不断减少的矩阵A上递归地重复上述算法。#in... 阅读全文
posted @ 2011-02-23 21:27 AndreMouche 阅读(837) 评论(0) 推荐(0)