
算法设计
STILLxjy
不要让任何人打乱你生活的节奏
展开
-
最长递增子序列
问题描述: 在数字列A={a1,a2….an}中按递增下标序列顺序选出一个子序列B,如果B中的数严格递增,则序列B为A的递增子序列。现给你一个数字序列,求出他的最长递增子序列。(只要求下标递增,不要求连续)。 分析: 用L[i]记录a1~ai的最长递增子序列的长度,初始值都为1。当求L[i]时,L[i]的值等于下标值j在i之前的(j#include using namespace s原创 2016-04-25 18:45:14 · 671 阅读 · 0 评论 -
分治算法-归并排序
问题描述: 输入:待排序列r[n],待排区间[s,t]; 输出:升序序列r[s]~r[t];分析: 1:划分; 2:求解子问题; 3:合并; 归并排序首先执行划分过程,直到子序列长度为1,再在回溯的过程中排序。在merge_()函数中,由于回溯回来的两个子序列已经有序,所以只需依次取出两者中最小值中的较小者即可。#include <iostream>using namespace std原创 2016-03-26 15:59:19 · 595 阅读 · 0 评论 -
分治法-最大字段和
问题描述: 给定由n个整数(可能有负数)组成的序列,求一段连续的子序列,要求该序列和最大,并求出最大值。 分析: 将该序列平分为两段(A1..An/2;An/2….An),最大字段段和有三种情况,1:为左边的最大子段和leftsum,2:为右边的最大字段和rightsum,3:由左边靠近中点的最大连续子段+右边靠近中点的最大连续子段midsum。所以最终结果为三者中的最大值(MAX(lefts原创 2016-03-26 20:18:02 · 4389 阅读 · 0 评论 -
分治法-最近对问题
问题描述: 输入:按x坐标升序排列的n(n>=2)个点的集合,S={(x1,y1),(x2,y2)….(xn,yn)} 输出:最近点对的距离。 分析: 用m=(low+high)/2,讲点划分为两部分,d1=左半部分点的最近距离,d2=右半部分点的最近对距离,d=min(d1,d2)。还需考虑在中线两边的点的最近距离,且只用考虑与中线距离#include <iostream>#includ原创 2016-03-26 21:38:02 · 5150 阅读 · 0 评论 -
减治法-两个序列的中位数
问题描述: 输入:两个长度为n的有序序列A和B 输出:序列A和B的中位数 分析: (1)求出两个序列的中位数a和b; (2)比较a和b,有下面三种情况; 2.1 : a == b 输出a或b,算法结束; 2.2 : a < b 则中位数在a~b之间,所以舍弃A中a之前的数得到序列A1,舍弃B中b之后的数得到序列B1。 2.3 : a>b 则中位数在原创 2016-03-27 11:34:57 · 3358 阅读 · 1 评论 -
淘汰赛冠军问题
问题描述: 有n个选手(n为2的K次方)进行比赛,两个选手中胜者参加下一场,负者出局,请求出最后的冠军。(比赛的胜负由cmp()函数决定,这里是比较两个字符的大小)。 分析: 本体很快可以想到两种方法,分治法和减治法。 分治法: 将选手平均分为两组,递归求出胜者; 减治法: 将选手分为n/2组,两两进行比较,胜者留在比较的数组范围中,直到只有一位选手为止;分治法代码:#include原创 2016-03-28 12:01:36 · 9370 阅读 · 4 评论 -
图着色问题
问题描述: 算法设计例题:图的m着色(回溯) memory limit: 5000KB time limit: 2000MS accept: 8 submit: 14 Description给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色,求有多少种方法为图可m着色。Input输入的第一个为测试样原创 2016-03-31 19:39:28 · 876 阅读 · 0 评论 -
选择问题-第k小元素
问题描述: 在一个无序的序列T中,寻找第k小的元素; 分析: 将序列T进行升序排列,下标为K的元素即为第k小的数。(下标从1开始)。考虑到快速排序的过程,每次进行一次Partition()函数,就将比轴线值小的数放在轴线左边,比轴线大的值放在轴线右边,即可确定一个轴线值的下标位置S。下面分三种情况: 1:s==k 即已经找到下表为k的数,return T[s]; 2 : s < k 即第k原创 2016-04-25 18:45:44 · 1971 阅读 · 0 评论 -
分治算法-归并排序
问题描述: 输入:待排序列r[n],待排区间[s,t]; 输出:升序序列r[s]~r[t];分析: 1:划分; 2:求解子问题; 3:合并; 归并排序首先执行划分过程,直到子序列长度为1,再在回溯的过程中排序。在merge_()函数中,由于回溯回来的两个子序列已经有序,所以只需依次取出两者中最小值中的较小者即可。#include <iostream>using namespace std原创 2016-04-25 18:46:26 · 559 阅读 · 0 评论