![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习记录
Garcia-zhang
正处于并将长期处于码农的初级阶段
展开
-
字符串匹配问题
题目要求:分别用KMP、Monte Carlo和Las Vegas算法编写3个程序,并随机生成不小于5000对、长度较长、且长度不等的01串X和Y(三个程序处理相同的串)统计算法的执行时间、Monte Carlo算法的出错率,并根据运行结果对三种算法进行深入的比较长度可为50、500、5000、50000位,Y不能太短主要思路:KMP算法主要思路是,先用i,j分别表示主串X和模式串Y中当前正比较的字符位置,从主串X的第pos个字符起,与串Y的第一个字符比较,如果相等,则继续比较后继字符,否则需利原创 2020-12-16 09:08:12 · 489 阅读 · 0 评论 -
数组元素变奇操作次数
题目要求:输入正整数n和长度为n(????≤105)的数列{????????}(1≤ai≤109)。在一次操作中你可以选择一个偶数c,并且把所有等于c的数除以2。例如a=[6,8,12,6,3,12],选择c=6进行一次操作后a=[3,8,12,3,3,12]。请问最少进行多少次操作后,{????????}的所有数都变成奇数。请尝试设计算法进行计算。样例输入640 6 40 3 20 1样例输出 4主要思路:先将输入的数组中的偶数全部找出来存放到另一个数组d[k]当中,k表示奇数数组内元原创 2020-12-16 09:08:03 · 128 阅读 · 0 评论 -
矩阵内移动路径2
题目要求:给定一个????∗????的矩阵,每个单元都有一个值,现在从左上走到右下再回到左上,中间不走重复的点,求所走单元的和的最大值。主要思路:本题是求从矩阵左上角走到右下角再回到左上角,该路径的最大值,并且要求中间不走重复的点。先定义一个数组a[100][100]用来存储每个单元的值。如果按照题目要求去寻找路径,走的方向是不一样的,比较难于区分是否走过重复的点,所以将该题转化为从矩阵左上角到右下角,找出两条不同的路径,使得相加得到的值最大。所以定义一个数组f[x1][y1][x2][y2],表示原创 2020-12-09 10:22:40 · 180 阅读 · 0 评论 -
矩阵内移动路径
题目要求:给定一个????∗????的矩阵,每个单元中都有一个非负整数,只能向右或向下移动。求从左上角到右下角的所有路径中的最大值(每条路径的值为对路径中所进过的格子中的数求和)主要思路:这道题目我用二叉树的思想来解决,左上角为初始结点,右下角为目标结点,每个节点(除目标结点外)都有两个子结点,分别表示往右走和往下走。先通过枚举法列出所有可能的路径,用队列实现打印所有路径。用结构体表示队列中每个点的状态(坐标值及其父结点,初始结点的父结点为-1),开始初始结点(根结点)进队列,然后循环执行以下操作直到原创 2020-12-09 10:20:11 · 230 阅读 · 0 评论 -
滑雪问题
题目要求:Michael 喜欢滑雪。为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,不得不再次走上坡或者等付升降机来载你。Michael 想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。当且仅当高度减小,一个人可以从某个点滑向上下左右相邻四个点之一。请设计算法求解以上问题并做分析主要思路:因为本题要求最长的滑雪坡的长度,即求一个最长的下降序列,并且只能向上下左右走,并且只能走更低的位置,这样的话,可以用递归DFS搜索每一个点能够下降的最长的长度,这里我定义原创 2020-12-09 10:17:43 · 1235 阅读 · 0 评论 -
最长公共子序列
题目要求:给定两个序列X和Y,基于备忘录方法,编写程序找出X和Y所有的最长公共子序列主要思路:本题的主要思路是先输入两个公共序列,然后采用备忘录方法来找出最长公共子序列的长度,根据最长公共子序列的长度来找出那些公共元素,把它们存到一个数组当中再输出,这样就可以解决问题了。备忘录方法,即采用自顶向下的递归来解决问题:从目标开始,将问题划分,对子问题求解,直到边界。第一步是先对备忘录进行初始化,为了之后快速判断是否有已经填写过备忘录。然后从两个序列的最后一个数开始,如果这两个数相等,就去查询它们对应的备原创 2020-12-09 10:12:51 · 228 阅读 · 0 评论 -
寻找指定数组元素和
题目要求:输入正整数????(????≤106),????(????≤2×109)和????个正整数ai(ai≤109)。试判断是否存在????,????使得ai+aj=S。样例输入5 73 6 7 2 1样例输出 YES样例解释 ????2+????5=6+1=7主要思路:先把输入的n个数输入到数组中,然后采用双重遍历,找出两个数和为S。并且为了不重复选择,第二个遍历从第一个遍历的右边开始。结果如下:#include<iostream>#include<stdio.原创 2020-12-09 10:09:26 · 99 阅读 · 0 评论 -
mod问题
题目要求:输入正整数????,????(????≤10^9 ????≤10^18)要求输出x^???? mod(10^9+7)样例输入3 5样例输出243主要思路:算法题中通常会要求对 10^9+7 取模,来避免整数溢出的问题。其中10^9+7是一个比较大的质数。通过typedef long LL;const LL num=1e9+7;和return result%num;来实现????od(10^9 +7)。而x^p由一个循环来实现while(n–){result*=a;}#incl原创 2020-12-09 09:57:43 · 955 阅读 · 0 评论 -
最大子段和问题
题目要求:随机给出一个整数序列,用分治法选出其中连续且非空的一段使得这段和最大主要思路:先随机生成一组有正负的数组(题目中有为空这个要求,暂时没有找到生成有正负又有空的数组应该怎样生成,后面有时间在看看)分治法需要将数组从中间分开,那么最大子数组就会有3种情况,要么完全在左半边数组,要么完全在右半边数组,要么跨立在分界点上。最大子数组完全在左数组、右数组采用递归方法解决。int sum1=calc(s,mid,l1,r1);int sum2=calc(mid+1,e,l2,r2);最大连续子数组跨立原创 2020-12-09 09:50:49 · 129 阅读 · 0 评论 -
最近点对问题
最近点对问题描述对平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,输出是N点中具有最短距离的两点题目要求:要求随机生成N个点的平面坐标,应用穷举法和分治法编程计算出所有点对的最短距离#include <iostream> #include <ctime>#include <cmath>#include <algorithm>using namespace std; #define NO_DISTANCE 1000原创 2020-12-09 09:44:26 · 1231 阅读 · 0 评论 -
众数问题
题目要求:在一个包含n个元素的多重集合S中,每个元素在S中出现的次数称为该元素的重数,多重集合S中重数最大的元素称为众数举例来说,多重集合S={1,2,3,3,3,3,4,4,5},则多重集合S的众数是3,元素3的重数为4现要求对随机生成的由n个自然数组成的多重集合S,编程计算S的众数及其重数主要思路:先生成含有N个元素的随机数组,定义两个数组,一个用来存放数组元素,一个用来存放各元素的个数,找出个数最大的下标对应的数组元素。第一步是调用随机数生成数组,这里我为了方便,将随机数的生成范围取为10原创 2020-12-09 09:41:26 · 409 阅读 · 0 评论