算法
迷茫的小菜
上前一步走,走,走
展开
-
图的遍历非递归实现的思路
使用到的数据结构说明:邻接表的形式说明 typedef struct node{//边表结点 int adjvex; //邻接点域 struct node *next; //链域 //若要表示边上的权,则应增加一个数据域 }EdgeNode; typedef struct vnode{ //顶点表结点转载 2014-10-21 16:18:00 · 689 阅读 · 0 评论 -
子集构造
1.位向量思路:集合中的元素,无非两种情况,一是选,二是不选,两条路分情况枚举递归就好2.二进制法:用二进制{0,1,2...n-1}来表示子集S,int i=[0,1 对于每个子集 从0到n-1转换为二进制与S取&,为1则输出,包括空集().#include#define MAX 10void print_subset(int n,int s){ int i; f原创 2017-05-21 10:37:06 · 486 阅读 · 0 评论 -
双基回文数
输入一个正整数n,至少在两个不同的进位制下,b1,b2都是回文数,(2,10)之间的进位制,回文数不包含前导0,输入正整数S思路:用count标记,在一个进位制下如果是回文数,则+1,为2时直接退出,输出结果 不包含前导0,回文数首位为0,直接退出判断回文数的循环#include#define MAX 32int main(){ int n; while(scan原创 2017-05-20 17:00:28 · 424 阅读 · 0 评论 -
最大乘积的实现
输入n个元素组成的序列,找出一个乘积最大的连续子序列,最大乘积不是正数(0和负数),输出-1,1分析:最大乘积为10^18,大于int整型最大值2^31,小于__int64 2^63 = 9.2*10^18;#include#include#define MAX 18int main(){int n;int temp[MAX];while(scanf("%d",原创 2017-05-20 00:07:26 · 383 阅读 · 0 评论 -
循环日程表问题
1.问题描述:有n=2^k个运动员进行网球循环赛,每个选手必须与其他n-1个选手各赛一次,1个选手1天只能比赛一次,设计日程表,有n行n-1列,第i行第j列为第i个选手第j天遇到的敌手;2.分析递归方法:日程表分相等四块,左下的值分别等于左上的值加(n/2);左上分别等于右下;左下分别等于右上3.二维指针作为实参传递,形参定义为指向一维数组的指针;#include#defin原创 2017-05-25 00:15:41 · 351 阅读 · 0 评论 -
逆序数对
1.思路:分治法 划分问题:分成尽量相等的两半;递归求解:统计i,j分别在左右时的逆序对个数;合并:统计i在左边,j在右边的逆序对数-->只需统计对右边的每个j,左边比他大的元素个数F(j)即可-->所有F(j)之和即为逆序对的个数-->递归排序按从小到大的顺序排列的过程中,将右边的元素复制到临时数组中时,说明左边剩余元素的个数都比A[j]大,即m-p个,用一个全局变量累加起来原创 2017-05-23 21:52:55 · 998 阅读 · 1 评论 -
最大连续和一遍循环解决问题的写法
1.思路:best为存储的最大的连续和,sum存储从开始到一直相加的结果begin为开始位置,end为结束位置#include#define MAX 100001int main(){ int n,count=1; int A[MAX]; scanf("%d",&n); while(n--) { int i,k=1,num; int begin=1,end=1,su原创 2017-05-23 19:24:43 · 351 阅读 · 0 评论 -
归并排序
参考《算法竞赛入门经典》时间复杂度:递归方程T(n)=2T(n/2)+o(n),T(1)=1 的解为T(n)=o(nlogn)1.思想:分治思想,把序列分成尽量相等的两半;把两半元素分别排序;将两个有序表合并成一个。关键部分:合并过程用类似解答树来理解分治思想的递归过程#include#define MAX 20void merge_sort(int *A,int x,int转载 2017-05-23 20:36:13 · 213 阅读 · 0 评论 -
分治法解决最大连续和
1.步骤:划分子问题-->递归求解子问题-->合并子问题的解合并的问题:先寻找最佳起点,再寻找最佳终点(从分界点分别向左,向右寻找),然后与子问题的最优解比较关键解决:输出起点和终点的位置 -1,0 begin=end=2 的情况暂时没有想到办法解决#include#define MAX 100001int begin=0,end=0;int maxsum(int *A,原创 2017-05-23 17:29:00 · 518 阅读 · 0 评论 -
Hanoi问题
x,y,z分别为初始塔,辅助塔,目的塔#includeint step=1;void move(int n,char from,char to){ printf("第%d步:将%d号盘子%c----->%c\n",step++,n,from,to);}void Hanoi(int n,char from,char help,char to)//理解顺序:将n个盘子由原创 2016-03-22 12:14:23 · 231 阅读 · 0 评论 -
括号匹配算法的栈实现
#include#include#include#includetypedef struct{char *base;char *top;int size;}Sqstack;int InitStack(Sqstack &s){s.base=(char *)malloc(10 * sizeof(char));if(!s.base)exit(-2)原创 2016-03-22 11:33:42 · 398 阅读 · 0 评论 -
数制转换的几种方法
原理:十进制N和其他d进制数的转换,N=(N div d) + N mod d;1.栈的实现typedef struct{ int *base;int* top;int stacksize;};void Turn(){InitStack(S);scanf("%d",N);while(N){Push(S,N%8); //以八进制为例N=N/8;原创 2016-03-21 20:17:25 · 773 阅读 · 0 评论 -
一元多项式相加
不采用顺序存储结构的原因:如果多项式的指数很大,但是系数非零项很少,将会浪费很多存储空间。一元多项式相加的运算规则:对于两个多项式指数相同的项,系数相加,若不为零,则构成和多项式的一项;对于所有指数不相同的项,照抄。int cmp( int a , int b){a>b;return 1;a=b;return 0;a}void Add(poly &Pa,poly &原创 2016-03-21 19:57:21 · 480 阅读 · 0 评论 -
将两个线性链表归并为一个有序链表
void List(L &La,L &Lb,L &Lc){//已知单链线性表La, Lb的元素按值非递减排列,//归并La和Lb,得到新的单链表Lcpa = La->next;pb=Lb->next; //La,Lb为链表的头结点Lc=pc=La;while(pa&&pb){if(pa->datadata){pc->next=pa;pc=pa;pa=pa->next原创 2016-03-21 18:59:30 · 792 阅读 · 0 评论 -
由内到外的螺旋矩阵
思路:红线方程y=x,绿线方程y=-x+4,4为矩形边长。两条直线将区域分为四个部分,划分好每个区域的边界值,每个区域的坐标变化规律有四种,x++,y++,x--,y--,接下来仔细分析就能得到算法:void SpiralArray(int size,int** ar){ int a=size/2*2+1;//保证转载 2016-03-17 22:20:51 · 1331 阅读 · 0 评论 -
顺时针螺旋矩阵
将螺旋矩阵分为4个区域,我遇到的问题是4个区域边界值的条件混乱,赋值顺序为从1->2->3->4,改变方向时数组的下标值没有划清。源代码:#include#define N 20int main(){int n;int a[N][N]={0};while(scanf("%d",&n)!=EOF){int base=1,i,j,k;for(k=0;k{转载 2016-03-17 22:09:09 · 851 阅读 · 0 评论 -
困难的串的思考
问题描述:如果一个字符串包含两个相邻的重复子串,则称它为容易的串,其他串称为困难的串,如:BB,ABCDACABCAB,ABCDABCD都是容易的,D,DC,ABDAB,CBABCBA都是困难的。输入正整数n,L,输出由前L个字符组成的,字典序第n小的困难的串。例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA思路很简单:方法1原创 2017-05-21 17:02:56 · 1552 阅读 · 2 评论