算法
文章平均质量分 70
自由不死
率性而行,适情而止
展开
-
排列组合的递归
令E={e1,e2,…,en}表示n个元素的集合,;Ei为E中移去元素ei后的集合,perm(X)表示集合X中元素的排列方式。Ei*perm(X)表示在集合X的每个排列方式的前面都加上ei后所得的排列方式。 则集合E的排列组合等于: n= 1;perm(E) = {e1}; n> 1;perm(E) = e1*perm(E1)+e2*perm(E2)+……+en*pe原创 2014-08-19 21:45:10 · 801 阅读 · 0 评论 -
最长公共子序列(递归法)
#include#include#include#include#includeusing namespace std;/**最长公共子序列(递归法)*/vector> b;//b[i][j]记录c[i][j]的值是由哪一个子问题的解得到的int LCSLength(string m,string n,int Finedx,int Sindex){ if(Finedx原创 2014-11-26 21:20:19 · 2289 阅读 · 0 评论 -
ZOJ Problem Set - 1004-Anagrams by Stack
唉!先直接上源代码吧!什么时候有时间的再来加说明!#include#include#include#include#include#includeusing namespace std;/**i代表PUSH,o代表POP*/bool judge(deque sou,deque des,vector & res){ stack inistack; for(ve原创 2014-11-06 13:06:32 · 1213 阅读 · 0 评论 -
油瓶分油问题
油瓶分油问题举例描述: 例如:有三个大小不一样的且没有刻度的油瓶,其容量分别为12升、8升、5升;三个油瓶的初始油量为:12升、0升、0升;可以随意用某一瓶的油去灌满一瓶油,也可以把某一瓶的油全部倒入其他可以装下的一瓶油中,要求最后能得到一瓶装有6升的油。编程要求: 用户分三行分别输入各个油瓶的容量和各个油瓶的初始油量,最后一行再输入要求得到的目标油量原创 2014-12-03 15:09:42 · 5722 阅读 · 0 评论 -
0-1背包问题(递归实现)
#include#include#include#include#includeusing namespace std;/**0-1背包问题(递归实现)*///int * * values;//values[i][j]表示在前i个物品中能够装入容量为j的背包中的物品的最大值 (二维数组方案一)vector> values;//values[i][j]表示在前i个物品中能够装原创 2014-12-03 21:01:51 · 4258 阅读 · 0 评论 -
0-1背包问题(动态规划)
#include#include#include#include#includeusing namespace std;/**0-1背包问题(动态规划)*/vector> values;//values[i][j]表示在前i个物品中能够装入容量为j的背包中的物品的最大值 (二维数组方案二)void knapsack(vector& w,vector& v,int n,原创 2014-12-03 22:05:16 · 1145 阅读 · 0 评论 -
活动安排问题(贪心算法)
问题描述: 有n个活动的活动集合E ,其中每一个活动都要求使用同一个资源,而在同一个时刻内资源只能被一个活动使用,每一个活动都有开始是时间和结束时间,要求从活动集合E中选出m个活动,使着m个活动都能顺利进行,即也就是每个活动的活动时间都互相不交叉,求m的最大值和 被选中的活动序号。例如输入:活动编号 活动开始时间 活动结束时间1原创 2014-12-05 08:47:17 · 4719 阅读 · 0 评论 -
分数背包问题(贪心算法)
#include#include#include#includeusing namespace std;/**分数背包问题(贪心算法)*/struct goods{ double value;//物品的价值 double weight;//物品的重量 double ratio;//物品的性价比 double in;//物品装入背包的重量 int index;/原创 2014-12-05 13:53:21 · 8268 阅读 · 2 评论 -
梯度下降算法
转载自:http://www.cnblogs.com/gongxijun/p/5890548.html2 正文 为了不显得阐述过于唐突,我们还是简单的对我们要说明的对象进行描绘一下吧~. 我们说的梯度算法 ,又称最速下降法 ,可以从它的名称中看出来,它就是用来快速寻找下降方向的(在数学上又叫做局部极小值).至于为什么叫做梯度算法,是因为其中转载 2016-11-20 21:43:27 · 865 阅读 · 0 评论 -
表格法---大整数乘法
首先,将乘数和被乘数按照每三位进行划分,列出乘法表,乘数和被乘数的地位分别放在表格的右端和上端。 8 216 547 96 785计算表格中的数值8216547*7682073652512966250原创 2017-07-19 17:31:06 · 923 阅读 · 0 评论 -
行列均递增的二维数组中查找元素
剑指offer中的一个原题:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,输入一个二维数组和一个数,判断该数组中是否有该数。解决思路:每次从二维数组的右上角作为查找起始点,如果右上角元素大于目标值,则把查找点所在的列排除,如果右上角元素小于目标值则把查找点所在的行排除,如果右上角元素等于目标值则返回true;在新的查找区域中将右上角元素再作为原创 2017-08-11 16:55:30 · 1038 阅读 · 0 评论 -
拼多多笔试题一:给出一个无序整数数组,求任意三个数的最大乘积
题目:给出一个可能包含正数、零、负数的无序整数序列,从该序列中任选三个数计算乘积,求最大的乘积是多少?要求:算法的时间复杂度为O(n),空间复杂度为O(1).输入:第一行输入n表示序列中整数的个数第二行输入n个整数输出;最大的乘积例如:输入:41 0 -2 -4输出:8import java.time.temporal.ValueRa原创 2017-08-02 10:42:03 · 5357 阅读 · 2 评论 -
最长公共子序列(动态规划)
#include#include#include#include#includeusing namespace std;/**最长公共子序列(动态规划)*/vector> c;//c[i][j]记录串a[0..i]与串b[0..j]之间的最长公共子序列的长度vector> b;//b[i][j]记录c[i][j]的值是由哪一个子问题的解得到的void LCSLength(原创 2014-11-26 20:50:04 · 967 阅读 · 0 评论 -
矩阵连乘(动态规划非递归)
对于矩阵连乘机问题就不概述了,主要是找出最佳的结合方式使得整个式子的运算次数最少。 对于这个问题之所以用动态规划的原因点如下: 第一:由于矩阵连乘机本身可以划分为若干个子矩阵链连乘机,而且若干个子矩阵链的最优解组合起来就是原矩阵链的最优解。 第二:对于原矩阵链的不同划分中个子问题是存在重叠子问题。 所以当此问题用动原创 2014-11-21 13:02:01 · 3326 阅读 · 0 评论 -
矩阵连乘(备忘录方法:自顶向下递归)
#include#include#include#includeusing namespace std;/**矩阵连乘(备忘录方法:自顶向下递归)*/vector> m;//m[i][j]表示矩阵Ai连乘到Aj的最少运算次数vector> s;//s[i][j]记录矩阵Ai和矩阵Aj之间的分割点//计算该连乘式子的最佳结合方式int MatrixChain(vector&原创 2014-11-26 19:53:41 · 4871 阅读 · 0 评论 -
箱子排序
概述:先根据被排序对象的属性值的最小值到最大值建立并编号一连串连续有序的箱;然后遍历一遍需要被排序的对象序列,每遍历到一个对象都根据其属性值找到并装入对应编号的箱子直到遍历完毕,这样会使不同属性值的对象在不同序号的箱子中,而相同属性值的对象则在同一编号的箱子中;最后再遍历一遍箱子序列并删掉对象个数为0的空箱子,则剩余的箱子序列即为有序的对象序列。 建议数据结构:如果有需要对于箱子序列最好原创 2014-08-19 22:05:41 · 3572 阅读 · 0 评论 -
基数排序
在箱子排序中,虽然时间复制度只有(n),但如果其箱子序列较大的话将会导致程序的空间复杂度较大,所以对于对于属性值跨度比较大的序列可以采用基数排序法。 概述:具体的做法是并不直接对这些数排序,而是采用一些基数来分解这些数,例如:用基数10来分解3725可以得到3、7、2和5。而利用60来分解可以得到1、2、5。然后再根据每一位基数从低位到高位对原数据进行排序,即若最长的基数有m位,直到原创 2014-08-19 22:11:25 · 1029 阅读 · 0 评论 -
火车车厢重排问题
问题描述:一列货运火车从出发站出发时火车上一共有n节车厢,编号分别是1到n。运货的各节车厢是在入轨上时是随机的顺序,火车头在出轨处,现在要将各节车厢按编号从大到小挂到车头上,其中在入轨与出轨之间有k条缓冲铁轨,将通过缓冲铁轨完成本次的火车车厢的重排。 具体规则:一、车厢从入轨的前部(即右端)只可以移动到一个缓冲铁轨的顶端或出轨的右端。二、缓冲铁轨的顶端的车厢只可以移动到出轨的最原创 2014-08-19 22:19:57 · 12155 阅读 · 0 评论 -
整数划分问题(只显示种类数)
这边博客对于整数划分问题,只要求求出对于每一个整数能够划分的种类数,采用金典的递归的办法解决。#includeusing namespace std;/**整数划分问题(只显示种类数)*/int GetIntDivision(int n,int m){ if(n==1&&m>=1) return 1; if(n>=1&&m==1) return 1; if(m>n)原创 2014-11-11 13:18:39 · 997 阅读 · 0 评论 -
循环赛日程表(非递归)
#include#include#include#includeusing namespace std;/**循环赛日程表(非递归)*/void Copy(int **map,int sr,int sl,int dr,int dl,int k){ for (int i = 0; i < k; i++) { for (int j = 0; j < k; j++) {原创 2014-11-12 21:28:20 · 1988 阅读 · 1 评论 -
循环赛日程表(递归法)
#include#include#include#includeusing namespace std;/**循环赛日程表(递归法)*/void Copy(int **map,int sr,int sl,int dr,int dl,int k){ for (int i = 0; i < k; i++) { for (int j = 0; j < k; j++) {原创 2014-11-12 21:30:28 · 6483 阅读 · 0 评论 -
棋盘覆盖问题
#include#include#includeusing namespace std;/**棋盘覆盖问题*/static int t=0;void ChessBoard(int **map,int r,int l,int pr,int pl,int size){ if(1==size) {return;} t++; int it = t; //左上角 if(pr<原创 2014-11-13 10:15:25 · 1073 阅读 · 0 评论 -
快速排序
#include#include#include#include#includeusing namespace std;/**快速排序问题*/void Fast_sort(vector& a,int beg,int end){ if(beg+1>=end) return; int key = beg; for (int i = beg , j = end; i < j;原创 2014-11-20 13:17:33 · 770 阅读 · 0 评论 -
选择问题(线性时间复杂度)
采用分治策略找出第K小的元素!要求程序的时间复杂度为线性函数。#include#include#include#include#includeusing namespace std;/**选择问题(线性时间复杂度)*在beg和end之间查找第k个元素*/int Fast_find(vector &vec,int beg,int end,int k){ if(k>end原创 2014-11-20 13:23:34 · 3932 阅读 · 0 评论 -
整数因子分解问题
#include#include#include#include#includeusing namespace std;/**整数因子分解问题*/vector vec;static int Count = 0;void solve(int n){ if(1==n) { cout<<"第"<<++Count<<"种分解: "; copy(vec.begin原创 2014-11-20 13:56:37 · 2967 阅读 · 0 评论 -
整数划分问题并显示每一种划分形式
#include#include#include#includeusing namespace std;/**整数划分问题并显示每一种分法*/set> GetAllIntDivision(int n){ set> allDivision; if(1==n) { multiset aa; aa.insert(1); allDivision.insert(aa)原创 2014-11-11 13:20:37 · 1523 阅读 · 0 评论 -
动态规划--求满足条件的数列
题目:小易非常喜欢拥有以下性质的数列:1、数列的长度为n2、数列中的每个数都在1到k之间(包括1和k)3、对于位置相邻的两个数A和B(A在B前),都满足(A 例如,当n = 4, k = 7那么{1,7,7,2},它的长度是4,所有数字也在1到7范围内,并且满足第三条性质,所以小易是喜欢这个数列的但是小易不喜欢{4,4,4,2}这个数列。小易给出n和k,希望你能帮他求出原创 2017-08-13 17:09:40 · 1428 阅读 · 0 评论