算法
cxs123678
心之所向,素履以往。生如逆旅,一苇以航!
展开
-
递归之整数的划分问题
整数的划分:以 4 为例 ,即将其写作: 4; 3+1; 2+2; 2+1+1; 1+1+1+1; 此处我们只讨论整数的划分一共有几种。即: 输入:整数 n 输出:n 的整数划分的种类数分析:int divide(n,m) 设其中 m 表示在整数划分中数字的最大划分值,所求即为 divide(n,n)。 代码如下:#include <iostream>using namesp原创 2017-11-18 18:12:53 · 300 阅读 · 0 评论 -
选择排序
选择排序的思想比较简单将数组中最大的数与数组的最后一个数交换位置,然后再将数组截去最后一个数,再次将新数组中的最大数与新数组的最后一个数交换位置。一直循环下去,直到数组的长度为1下面是插入排序的c语言#include <stdio.h>int findMaxPos(int arr[],int n){ int max = arr[0]; int ...原创 2018-10-12 23:12:35 · 175 阅读 · 0 评论 -
贪心算法之单源最短路径(Dijkstra算法)
单源最短路径 :在一张图中,求某一个点s(源点)到其余各个顶点的最短路径。如下图: 分析: 我们使用邻接矩阵来存储这个图。使用一个一维数组来存储最短路径(下标代表相应的顶点,下标对应的值代表源点到该点的最短路径)。 算法: 1.将所有的顶点分为两类:已知最短路径的顶点集合P和未知最短路径的顶点集合,用book数组来记录哪些顶点在P中。 2.初始化:设置源点s到自身的距离为0(dis[s]=原创 2017-12-07 12:15:59 · 1954 阅读 · 0 评论 -
动态规划-图像压缩问题
1、问题描述: 在计算机中,常用像素点的灰度值序列{p1,p1,……pn}表示图像。其中整数pi,1<=i<=n,表示像素点i的灰度值。通常灰度值的范围是0~255。因此最多需要8位表示一个像素。压缩的原理就是把序列{p1,p1,……pn}进行设断点,将其分割成一段一段的。分段的过程就是要找出断点,让一段里面的像素的最大灰度值比较小,那么这一段像素(本来需要8位)就可以用较少的位(比如7位)来表示转载 2017-11-26 20:54:22 · 2656 阅读 · 1 评论 -
动态规划之矩阵连乘
假设矩阵A1:m*n , A2:n*p ,则A1*A1:m*p ,其中它们相乘的次数为:m*n*p。 矩阵连乘:多个矩阵相乘,它满足结合律,故计算矩阵连乘有许多不同的计算次序,不同的计算次序也会导致计算量(数乘次数)的不同。例如: 有三个矩阵A1:10*20,A2:20*40,A3:40*30,则A1*A2*A3有两种计算次序: (一)、(A1*A2)*A3,则计算量(数乘次数)为原创 2017-11-26 10:52:30 · 588 阅读 · 0 评论 -
二分查找(非递归)
设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j。当搜索元素在数组中时,I和j相同,均为x在数组中的位置。 感觉这个题目挺简单的,所以直接上代码了!#include <iostream>using namespace std; bool BinarySearch(int a[],int n,int x,原创 2017-11-18 20:35:38 · 554 阅读 · 0 评论 -
分治法之归并排序
先上图: 归并排序的关键: 1.将待排序的数组分割,一直分到只有一个数.(那么这个数必然是排好序的)。 2.将分割后的原子级别的数两两合并,最后产生结果,并填充到原数组中!#include <iostream>using namespace std;int a[100];int n;//数组长度 void merge(int arr[],int L,int M,int R){ //原创 2017-11-25 00:43:28 · 211 阅读 · 0 评论 -
分治与递归之快速排序
快速排序:有两个哨兵 i , j , j 向左走,寻找比基准数更小的数,找到且 j > i时,i 开始向右走,寻找比 j 基准数更大的数,当找到且 i < j时,交换这两个数。直到i=j时,交换基准数与 i 当时所指的数。此时,基准数的左边都比 基准小,右边的都比它大。至此,这组数据一分为二,在分别对子数据重复上述操作!如图: 代码如下:#include <iostream>us原创 2017-11-23 21:10:18 · 542 阅读 · 0 评论 -
动态规划之最大子段和问题
有一由n个整数组成的序列A={a1,a2,…an,},求该序列如 a[i]+a[i+1]+…+a[j]的子段和的最大值。如果序列中全部是负数则最大子段和为0,依此定义,所求的最优值max{0,a[i]+a[i+1]+…+a[j]},1≤i≤j≤n。输入:n //序列的长度 序列值输出:最大子段和例如: 输入: 6 -2,11,-4,13,-5,-2 输出:原创 2017-11-21 19:16:38 · 801 阅读 · 0 评论 -
动态规划之最长公共子序列
子序列与子串不同,子串一定要连续,子序列可以不连续! 对于给定的两个序列 X{x1, x2, x3, … },Y{y1, y2, y3, …};求X与Y的最长公共子序列,可采用动态规划的方法。 1.当x1 = y1时,则此时已找到一个相同的值,故接下来只需求{x2, x3, x4, …}和{y2, y3, y4, …}的LCS。 2.当x1 != y1时,则此时X和Y的LCS是下面两个LCS的原创 2017-11-21 13:07:58 · 168 阅读 · 0 评论 -
动态规划之01背包问题
给定n种物品和一个背包,物品i的重量是w[i],其价值是v[i],所有物品的重量和价值都是非负的,背包的容量是C。我们限定每种物品只能选择0个或者1个。问应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?解题思路: 最终的目标是在总重量不超过C的前提下,使得总价值最高。在总重量不超过Y(Y<=C)的前提下,我们将前i种物品的总价值所能达到的最高价值定义为value[i][Y] ,原创 2017-11-20 21:27:05 · 698 阅读 · 0 评论 -
动态规划之数字三角形
读北京大学李文新老师的《算法基础与在线实践》觉得动态规划这篇老师写的很好,就写了这篇博客,算是记笔记吧! 数字三角形问题: 如: 1 3 2 4 10 1 4 3 2 20寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大, 路径上的每一步只能往左下或者右下走。 输入格式:原创 2017-11-19 14:29:24 · 261 阅读 · 0 评论 -
分治与递归之棋盘覆盖
棋盘覆盖问题要求在2^k * 2^k 个方格组成的棋盘中,给定任意一个特殊点,实现对除该特殊点的棋盘实现全覆盖。如图所示: 代码如下:#include <iostream>#include <cmath>using namespace std;int title=1;//设置L型骨牌编号int board[2049][2049];void chessBoard(int tr,int tc原创 2017-11-18 21:12:15 · 347 阅读 · 0 评论 -
插入排序
注:本文中排序默认为从大到小,插入顺序从后往前插。插入排序的思想是将一个数插入到一组已经排好序的子数组中,如果这个数比子数组的最后一个数小,那么将子数组最后一个数往后移一位,如果这个数比倒数第二个还小,那么将倒数第二个往后移一位,......直到找到比它大的数,将这个数字插入在比它大的数的后面。c语言插入排序的实现代码:#include <stdio.h>void ins...原创 2018-10-14 11:16:35 · 202 阅读 · 0 评论