算法
ShirleyPaul
这个作者很懒,什么都没留下…
展开
-
贪心法__动态规划-数塔问题
贪心法,是一种在每一部选择中都采取在当前状态下最好或最优的选择,从而获得最优解的算法。一种直观的解释就是『一直向前!』。贪心法可以解决一部分常见算法问题,比如最小生成树、哈弗曼编码等,并且如果一个问题可以用贪心法解决的话,贪心法一定是最优的算法。对于大部分问题如果使用贪心法未必会得到最优解。比如走迷宫的时候一直往终点走,就很有可能走到死胡同中。不过对于大部分问题,贪心法至少可以给出一个接近最优的解,原创 2016-07-09 21:09:56 · 2368 阅读 · 0 评论 -
汉诺伊塔 的Python基本实现
汉诺塔 (http://baike.baidu.com/view/191666.htm) 的移动也可以看做是递归函数。我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为:如果a只有一个圆盘,可以直接移动到c;如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。原创 2016-09-03 10:25:07 · 896 阅读 · 0 评论 -
分治_递归_quick_sort
#include <cstdio>#include <iostream>using namespace std;void quick_sort(int dat[], int l, int r) { // 首先请填写下面三个变量的初值 int i = l, j = r, mid =dat[r] ; do { while (dat[i] < mid) ++i原创 2016-07-09 15:56:43 · 210 阅读 · 0 评论 -
冗余关系的判断_递归
线段树,听名字就能猜到啦,就是一颗每个节点都是线段的树。具体来说,这是一颗平衡二叉树,它的每个节点都是一个区间。就像下面这张图:我们处理线段树的时候需要用递归实现,线段树可以实现单点更新(比如修改区间上某个点的值)、区间更新(比如将某段区间的值统一加x)、单点查询(查询某个点的当前值)和区间查询(查询某段区间的所有点值的和),并且都是O(logN)的时间复杂度,是程序设计竞赛中非常常用的数据结构。冗原创 2016-07-09 11:57:02 · 1961 阅读 · 0 评论 -
循环双端队列示例C++_通话列表的保存
#include <iostream>#include <cstdio>#include <queue>using namespace std;const int LEN = 10;// 自定义循环队列类,来实现题目要求的某一类// 在程序中调用定义举例如下:// circular_queue Q;// 如果要定义数组,比如这道题需要定义一个长度为3的循环队列数组,则参考如下定义:原创 2016-07-07 17:08:19 · 357 阅读 · 0 评论 -
dfs搜索
穷举法,又称枚举法,是指从可能的解的集合中一一枚举各个元素,用给定的检验条件判定哪些是无用的,哪些是有用的。能使命题成立即为其解。穷举法本质上属于搜索算法,但他与搜索有所不同,因为适用于枚举法求解的问题必须满足:可预先确定解的数量;预先确定解变量的取值范围。穷举算法的关键,首先是确定循环的范围,其次是找出判断解的条件。将这两个关键点解决,穷举算法解题是轻而易举的。搜索算法和穷举法类似,对于那些无法用原创 2016-07-07 00:53:34 · 614 阅读 · 0 评论 -
分治策略
分治,即“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。总结起来就是:分解、解决、合并,这三大步。分治策略最经典的一个例子就是折半搜索算法,也就是二分查找。二分查找是在有序数组中查找某一特定元素的搜索算法。搜索过程中从数组的中间元素开始,判断待查元素和中间元素的关系,来判断接下来是选择哪一半继续搜索。由于折半搜索算原创 2016-07-05 10:05:35 · 425 阅读 · 0 评论 -
判断单链表是否含环
原文链接 http://www.cnblogs.com/shuaiwhu/archive/2012/05/03/2480509.html如图,如果单链表有环,则在遍历时,在通过6之后,会重新回到3,那么我们可以在遍历时使用两个指针,看两个指针是否相等。方法一:使用p、q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数是否和q一样。如图,当p从6走到3时,用了6步,此时若q从转载 2016-07-10 21:18:14 · 276 阅读 · 0 评论 -
动态规划_爬楼梯
动态规划 爬楼梯问题 爬楼梯的时候一次只能迈1级或2级台阶,假如一共有n级台阶的话,它一共有多少种方法能够爬到楼梯顶部呢? 输入格式: 第一行输入一个数n(n<=50),代表楼梯的级数。 输出格式: 第一行输出你的方法总数。#include <cstdio>#include <iostream>int calMethod(int n){ if(n<0)原创 2016-07-10 00:20:15 · 301 阅读 · 0 评论 -
字典序最小问题_思路
给定长度为N的字符串S,要构造一个长度为N的字符串T。期初,T是一个空串,随后反复进行下列任意操作:1>从S的头部删除一个字符,加到T的尾部; 2>从S的尾部删除一个字符,加到T的尾部。目标是要构造字典序尽可能小的字符串T。比如当N=6,S=”ACDBCB”时,程序应输出ABCBCD。思路: 将S反转后的字符串定为S’,比较S和S’的字典序,如果S较小则从S开头取字符加到T的末尾,反之从S末尾取原创 2016-07-09 21:41:08 · 10118 阅读 · 1 评论 -
动态规划_最长上升子序列LIS
最长上升最序列Longest Increasing Subsequence 动态规划解决的经典问题 子序列不等于子串,子串一定是自序列,但子序列不一定是子串 因为子串必须连续将该题分解为n个子问题: 求解最后一个元素为原数组第i个元素的最长上升子序列 的长度#include <iostream>#include <cstdio>using namespace std;int n, dp原创 2016-07-09 21:27:31 · 225 阅读 · 0 评论 -
POJ_Biorhythms_递归_中国剩余定理求解
BiorhythmsTime Limit: 1000MS Memory Limit: 10000KDescriptionSome people believe that there are three cycles in a person’s life that start the day he or she is born. These three cycles are the phys原创 2016-09-27 16:31:13 · 390 阅读 · 0 评论