算法导论学习笔记
qq120848369
这个作者很懒,什么都没留下…
展开
-
归并排序;分治算法;复杂度nlgn;附加逆序数算法;
#include using namespace std;class MergeSort//归并排序类{private: int *arr; //待排序数组 int *temp; //临时记录数组 int length; //数组长度 int num;//逆序对数量 public: //构造函数 MergeSort(int len原创 2010-03-29 21:56:00 · 1538 阅读 · 0 评论 -
回溯算法; 算法设计与分析作业; 最小机器重量;
#include using namespace std;#define MAX 99999class LightMachine{private: int n;//n个部件 int m;//m个供应商 int **weight;//weight[i][j]表示j供应商提供的第i个部件的重量 int **price;//price[i][j]表示j供应商提原创 2010-04-08 21:16:00 · 1505 阅读 · 2 评论 -
ACM论坛1.1 打印菱形图案
#include using namespace std;int flag=0;int n;int m;int space;int j;void print(int n){ m=1; for(int i=1;i<=n;i++) { j=1; space=(n-m)/2; while(j<=space) { cout原创 2010-04-10 10:14:00 · 1185 阅读 · 0 评论 -
论坛1.2 ;n阶 幻方;
#include using namespace std;int arr[100][100];int i,j;int prei,prej;void print(int n){ for(int k1=1;k1<=n;k1++) { for(int k2=1;k2<=n;k2++) { arr[k1][k2]=-1; } }原创 2010-04-10 11:09:00 · 562 阅读 · 0 评论 -
论坛1.3;进制转换;
#include using namespace std;int shang;int yushu;int count;int arr[100];void print(int n,int k){ shang=n<0 ?-n:n; count=0; while(shang!=0) { ++count; yushu=shang%k;原创 2010-04-10 12:08:00 · 538 阅读 · 0 评论 -
论坛1_5 ;判断质数
#include #include using namespace std;void print(int n){ if(n==2) { cout<<n<<"是质数"<<endl; return; } else { int k=(int)sqrt((double)n); for(int i=2;i<=k;i++) { if原创 2010-04-10 12:24:00 · 524 阅读 · 1 评论 -
论坛1.5;字符串匹配;
#include #include using namespace std;char a1[100];char b1[100];string a;string b;int l1;int l2;void print(){ cin.getline(a1,sizeof(a1));//** a=a1; cin.getline(b1,s原创 2010-04-10 13:02:00 · 547 阅读 · 0 评论 -
水仙花数;穷举搜索;
#include using namespace std;void main(){ int a; int b; int c; for(a=0;a<=9;a++) { for(b=0;b<=9;b++) { for(c=0;c<=9;c++) { if(a*100+b*10+c*1==a*a*a+b*b*b+c*c*c)原创 2010-04-10 14:29:00 · 572 阅读 · 0 评论 -
斐波那契数列
#include using namespace std;void main(){ int n; cin>>n; double i=1; double j=1; double sum=0; double temp; while(n>=1) { sum+=i/j; temp=i; i=i+j; j=temp; --n;原创 2010-04-10 14:45:00 · 578 阅读 · 0 评论 -
最大子矩阵问题;枚举行的组合,然后利用一维最大子段和的DP算法;
#include using namespace std;class Martrix{private: int **martrix;//矩阵 int *b;//记录每一列的和值 int row;//行 int col;//列 int maxSum;public: Martrix(int row,int col) { martrix=new原创 2010-04-07 22:34:00 · 953 阅读 · 1 评论 -
动态规划;多边形游戏;类似圈型石头合并;算法设计分析作业;
/*题目:多边形游戏作者:梁栋版本:VS2008状态转移式:min(max)_sum[i][j] ,表示从i数逆时针数j个的链条合并的最小或者最大值方法: 从i到i+j-1中找一个运算符断开,会有两种情况.情况一: 运算符为 +, 则整个链条的最大或者最小值等于两个子链条的最大或者最小值的和情况二: 运算符为 *, 则整个链条的最大或者最小值等于两个子链条的最原创 2010-04-21 18:18:00 · 1847 阅读 · 0 评论 -
KMP算法;学习严蔚敏;大概理解;
#include #include #include using namespace std;string s;//主串string t;//模式串vector next;//next函数值vector nextval;//next修正函数值void get_next(){ int i=1; int j=0; next[1]=0; w原创 2010-04-22 11:18:00 · 1527 阅读 · 1 评论 -
并查集的一道题目;发现可以用并查集就简单了;
#include #include using namespace std;class Union_Find_Sets{public: inline Union_Find_Sets() {} void make_set(int n); int find_set(int n); void union_set(int x,int y); int coun原创 2010-04-25 18:02:00 · 1173 阅读 · 0 评论 -
大学生每日一算法;4月25日;并查集的应用;
#include #include using namespace std;class Union_Find_Sets{public: inline Union_Find_Sets() {} void make_set(int n); int find_set(int n); void union_set(int x,int y); int coun原创 2010-04-25 14:41:00 · 1415 阅读 · 4 评论 -
线段树基础;逐步加深;还有个地方不理解;
#include using namespace std;#define MAX 16000int left_child[MAX],right_child[MAX],left_bound[MAX],right_bound[MAX],color[MAX],bj[MAX];int node=0,res[MAX],temp;void clear(int index){原创 2010-04-26 14:27:00 · 821 阅读 · 1 评论 -
简单的练习一下双哈希;就表达那么一个意思;
#include #include #include #include using namespace std;class Double_Hash_List{public: inline Double_Hash_List(int list_size=97):_list_length(list_size),_list_size(0) { _hash_li原创 2010-04-26 22:46:00 · 2081 阅读 · 0 评论 -
线段树的简单应用;火车订票;线段树用起来太灵活了!;
#include using namespace std;#define MAX 16000int left_child[MAX],right_child[MAX],left_bound[MAX],right_bound[MAX],seat[MAX],bj[MAX];int node=0,res[MAX],num;void clear(int index){ s原创 2010-04-27 11:29:00 · 899 阅读 · 0 评论 -
马踏棋盘+贪心启发搜索;第一次接触这么高级的搜索-,-;下一步准备学习双向广搜了;
#include #include #include #include using namespace std;typedef struct{ int x; int y;}Direc;//横向x,纵向y,右正,下正Direc direc[8]={{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-原创 2010-04-29 18:05:00 · 1296 阅读 · 0 评论 -
动态规划;最大子段和;温故而知新-。-;这个动规公式找的很聪明;
#include using namespace std;class MaxSum{private: int maxSum; int b; int *arr; int length;public: MaxSum(int length) { this->length=length; b=0; maxSum=0; arr=原创 2010-04-07 21:55:00 · 838 阅读 · 0 评论 -
石子合并;圈型;动态规划;重点在于处理圈型问题;代码内有算法解释;
#include using namespace std;class StoneMerge{private: int **result;//动态规划记录result[i][j]表示从i起逆时针数j个的合并最大得分 int num;//有num堆石子 int *weight;//记录num堆石子的重量 int totalScore;//记录总分public原创 2010-04-07 18:42:00 · 1272 阅读 · 1 评论 -
算法设计课思考题;矩阵着色;回溯算法;抽象成图;
#include using namespace std;typedef struct { char *vex;//矩阵命名 int **edge;//矩阵联系 int num;//矩阵数量}Graph;class ColorMatrix{private: Graph graph;//矩阵图形描述 int *color;//可以填涂的颜色原创 2010-04-07 17:54:00 · 953 阅读 · 0 评论 -
最小堆得实现;优先队列的堆实现;堆排序的时间复杂度nlgn;
#include using namespace std;class MinHeap{private: int heapSize;//堆大小 int *arr;//数组public: //构造函数 MinHeap(int length)//传入数组初始化大小 { this->heapSize=length; arr=new int[50]原创 2010-03-30 12:10:00 · 4346 阅读 · 0 评论 -
分治算法;随机化划分函数;快速排序;线性时间选择第K小元素;快速排序平均时间复杂度nlgn;
#include using namespace std;class QuickSort{private: int *arr;//待排序数组 int length;//数组长度public: //构造函数 QuickSort(int length) { arr=new int[length+1]; this->length=length;原创 2010-03-30 18:49:00 · 4750 阅读 · 7 评论 -
动态规划;最长公共子序列;LCS问题;
#include using namespace std;class LCS{private: char *mString;//字符串m char *nString;//字符串n int **lcs;//降低空间复杂度,利用2*n维数组记录lcs[1:m][1:n]当前与前一行的状况 int **record;//为了能够从顶至下的构造出LCS进行的记录 i原创 2010-03-31 17:52:00 · 958 阅读 · 0 评论 -
动态规划;漂亮打印问题;时间复杂度O(n方); 思考方法记录在内;
#include using namespace std;//漂亮打印问题//穷举法:根据递归树,当前层可以放前几个单词,下一层分别又可以放剩余的前几个单词, 所以穷举规模为指数级,不合理。//具有最优子结构性质://当满足 : 求和{ (lengthOfWords i -> j) +(j-i) } <= M 时, 即i 到j的单词可以放入一行,此时 m[i原创 2010-03-31 21:45:00 · 4560 阅读 · 0 评论 -
汉诺塔变形问题;开拓你的思维;
Hanoi塔的问题题目描述:Hanoi塔的问题相信大家很熟悉了:有三根针上放了一些圆盘,半径各不相同,大的不能放在小的上面,每次只能移动一个,要把它们全部移到第三根针上输入:多组测试数据,每组两行。第一行是n(1第一个数表示最大的盘在第几根针上,第二个数表示次大的盘在第几根针上,第n个数表示最小的盘在第几根针上,输入的n为0的时候结束输出:全部移动到第三根针上所需要的最少步数样例输入:311133原创 2010-04-11 11:30:00 · 1370 阅读 · 0 评论 -
贪心算法;最小堆+哈夫曼树;打印出每个字母对应编码;调试了几次,应该无错;
#include using namespace std;typedef struct HuffmanNode//哈弗曼树的结点{ char letter;//存储的字符,叶节点为字母,非叶节点为# struct HuffmanNode *parent;//父亲结点 int code;//如果为父结点的左孩子,则为0,右孩子为1}HuffmanNode;ty原创 2010-04-01 22:44:00 · 2799 阅读 · 0 评论 -
回溯算法;双船装载问题;限界+约束;子集树;时间复杂度:O(2的n次方);
#include using namespace std;class MaxLoading{private: int numOfItems;//物品数量 int *weight;//物品重量 int boatSpace1;//船1的容量 int boatSpace2;//船2的容量 int *best;//记录最优的物品选择情况 int *path;//原创 2010-04-02 09:09:00 · 3728 阅读 · 0 评论 -
回溯算法;批处理作业调度;排列树;时间复杂度O(n!);内有简单思路;
#include using namespace std;#define MAX 999999//排列树问题,规模O(n!),通过剪枝实现回溯算法,减小解空间树规模class Flowshop{private: int firstTime;//机器1最后完成时间 int secondTime;//机器2最后完成时间 int totalTime;//原创 2010-04-02 11:00:00 · 5315 阅读 · 2 评论 -
0-1背包问题;动态规划;时间复杂度O(n方);给出最大价值与解得情况;内有动态规划思路总结;
#include using namespace std;//动态规划:0-1背包问题//bestValue[i][j]=max ( bestValue[i+1][j-w[i]]+v[i] ,bestValue[i+1][j] ) w[i]<=j//bestValue[i][j]=bestValue[i+1][j] w[i]>jclass Knapsac原创 2010-04-01 12:48:00 · 17430 阅读 · 0 评论 -
贪心算法;部分背包问题;快速排序O(nlgn);贪心算法O(n);
#include using namespace std;//贪心算法解决部分背包问题class GreedyKnapsack{private: int *weight;//物品重量 int *value;//物品价值 int numOfItems;//物品数量 int bagSpace;//背包容量 double bestValue;//最大价值原创 2010-04-01 16:09:00 · 4040 阅读 · 1 评论 -
回溯算法;旅行售货员问题;排列树;需要访问的是各个地点,不是路径;第一个排列点是出发点;O(n!)
#include using namespace std;#define NoEdge -1#define MAX 99999class Traveling{private: int num;//城市数量 int **graph;//邻接矩阵存储城市之间联系图 int *x;//记录回溯算法的解 int *bestX;//记录最优解 int be原创 2010-04-02 19:00:00 · 2746 阅读 · 1 评论 -
每对顶点间最短路径;Floyd算法;写的很乱,判断太多了;没有用动态规划过程中构建路径;用O(n三次方)时间构造路径;
#include using namespace std;#define NoEdge 1000typedef struct{ char *vertices;//图的顶点 int num;//顶点数量 int **edge;//边的权值}Graph;class Floyd{private: int **dist;//最短路径权值和 i原创 2010-04-05 12:38:00 · 902 阅读 · 0 评论 -
稀疏图;两点间的最短路径;Johnson算法;只描述一下思路;
Floyd算法用三重循环完成对每一对顶点间不断插入编号k++顶点的过程,最终求得每对顶点间顶点序号不大于numOfVertices的最短路径.这对于稠密图来说很好. 但是如果图是稀疏的,那么边的数量很少,所以为了减少这个遍历插入所有顶点的过程,用了单源最短路径算法迪克拉斯算法+Bellman-Ford松弛算法,使问题反而变得更加简单。 首先对图G加入一个新的顶点s,然后生成s到原创 2010-04-05 19:05:00 · 4169 阅读 · 0 评论 -
图论;最小生成树;普利姆算法;贪心策略;可用最小堆实现;
#include using namespace std;#define MAX 1000 //用于表示顶点之间没有联系//无向图的邻接矩阵定义 typedef struct { char *vertics;//存放图中结点 int **edge;//存放邻接矩阵 int num;//存放图中顶点数量 }原创 2010-04-03 22:48:00 · 2782 阅读 · 3 评论 -
符号三角形问题;回溯算法;子集树问题;时间复杂度O(2的n次方);
#include using namespace std;class Triangle{private: int num;//第一行的符号数量 int **p;//存储+ -号,0表示-,1表示+ int count;//记录+号数量,根据+号数量,可以用i*(i+1)/2-count求出减号数量 int sum;//记录+与-数量相等且等于num*(num+1原创 2010-04-02 16:12:00 · 4795 阅读 · 1 评论 -
图论;克鲁斯卡尔算法;最小生成树;通过权值排序可以优化时间效率;
#include using namespace std;#define NoEdge 1000////无向图的邻接矩阵定义typedef struct { char *vertics;//存放图中结点 int **edge;//存放邻接矩阵 int num;//存放图中顶点数量}Graph;//克鲁斯卡尔求最小生成树class Kruska原创 2010-04-03 21:25:00 · 2336 阅读 · 0 评论 -
图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
#include using namespace std;#define NoEdge 1000 //NoEdge表示无法连通#define NIL -1 //表示无前驱#define GRAY 0 //表示正在拓展的顶点#define WHITE -1 //表示还未到达过的顶点#define BLACK 1 //表示顶点的4周都已访问结束typedef str原创 2010-04-04 14:09:00 · 2729 阅读 · 0 评论 -
贴个JAVA写的康拓展开算法;效率一般,思想有了就行;....
public class CountPos { public int countPos(int []array){ int length=array.length; int sum=0; for(int i=0;i<length;++i){ int count=array[i]-1; if(count!=0){ for(int j=0;j<i;++j){原创 2010-05-09 23:48:00 · 868 阅读 · 0 评论