算法
文章平均质量分 69
兔子大天使
我总是在对的时间做错误的事情。
我可以放弃一切,除了你
展开
-
关于回朔算法
回朔法是计算机程序设计中通用的算法随着计算机性能越来 越好,穷举已经成为了解决问题的一个有效地途径。在穷举途径中采用回朔的方法,关键是要设计好剪枝方法。通用的回朔法的程序模板如下(《挑战编程》)#include "stdafx.h"#define maxCandidates 20bool finished=false;backtrack(int a[],int k;int input){ int c[maxCandidates]; int ncandidates; int i=0原创 2010-11-30 16:36:00 · 2731 阅读 · 0 评论 -
错排问题
n个有序的元素应有n!种不同的排列。如果一个排列使得所有的元素都不在原来的位置上,则称这个排列为错排。任给一个n,求出1,2,3,。。。,n的错排个数D为多少,并且给出所有的错排方案例如1,2,3,4,每个数字不在自己的位置上就是错排,求错排数量和错排方案求数量方案一,F(n)=n!-C(n,1)F(n-1)-C(n,2)F(n-2)-...-C(n,n)F(0)。F(0)=1;F(1)=0;该方案不能用来求错排方案方案二:求错排的两种方式 方式a,n与1,n-1交换,剩下的n-2个元原创 2011-04-12 17:05:00 · 2874 阅读 · 0 评论 -
单色三角形
空间里有n个点,任意三点不共线。每两个点之间都用红色或者黑色线段链接。如果一个三角形的三条边同色,责成这个三角形是单色三角形。对于给定的红色线段列表,找出单色三角形的个数。分析:如果直接找需要枚举所有的三个点的组合,有C(n,3)种组合,当n比较大的时候,需要枚举的组合很多,复杂度为O(n3);但是在遍历每个点的时候都可以枚举颜色不同的两条边。则每个点上不同的颜色的三角形有R*B,R为红色边的个数,B为黑色边的个数。所有点上的不同颜色边组之和为Q,则总共有C(n,3)-Q/2种相同颜色的边。时间复杂度变为了原创 2011-04-14 13:46:00 · 2145 阅读 · 0 评论 -
重叠区间大小
<br /> <br /><br />题目描述:<br /> <br />请编写程序,找出下面 “ 输入数据及格式 ” 中所描述的输入数据文件中最大重叠区间的大小。<br />对一个正整数 n ,如果 n 在数据文件中某行的两个正整数(假设为 A 和 B )之间,即 A<=n<=B 或 A>=n>=B ,则 n 属于该行;如果 n 同时属于行 i 和 j ,则 i 和 j 有重叠区间;重叠区间的大小是同时属于行 i 和 j 的整数个数。<br /><br /> <br />例如,行( 10 20 )和( 1原创 2011-06-02 16:30:00 · 979 阅读 · 0 评论 -
低频词过滤
低频词过滤题目描述:请编写程序,从包含大量单词的文本中删除出现次数最少的单词。如果有多 个单词都出现最少的次数,则将这些单词都删除。 输入数据:程序读入已被命名为 corpus.txt 的一个大数据量的文本文件,该文件包含英 文单词和中文单词,词与词之间以一个或多个 whitespace 分隔。(为便于调试,您可下载 测试corpus.txt 文件,实际运行时我们会使用原创 2011-06-07 15:53:00 · 3830 阅读 · 1 评论 -
棋盘移动问题
5*5的棋盘上有24个棋子,有一个空位,棋子都不相同,现在随意的移动空位,只知道棋盘的初始状态和终止状态,以及每一种移动方法的次数,例如上5次等,求是否存在这样一个序列,如果存在,输出该序列,否则输出0该题目的剪枝条件为1,横向移动步数之和与初始坐标之和为目标坐标,同理纵向移动步数2,每个方向的移动步数小于等于该方向最大的步数3,每次移动不能超过边界算法为典型的回朔法原创 2011-06-07 16:07:00 · 1729 阅读 · 0 评论 -
单色三角形问题
空间里有n个点,任意三点不共线。每两个点之间都用红色或者黑色线段链接。如果一个三角形的三条边同色,责成这个三角形是单色三角形。对于给定的红色线段列表,找出单色三角形的个数。1,如果直接找需要枚举所有的三个点的组合,有C(n,3)种组合,当n比较大的时候,需要枚举的组合很多,复杂度为O(n3);但是在遍历每个点的时候都可以枚举颜色不同的两条边。则每个点上不同的颜色的三角形有R*B,R为红色边的个数,B为黑色边的个数。所有点上的不同颜色边组之和为Q,则总共有C(n,3)-Q/2种相同颜色的边。时间复杂度变为了O原创 2011-04-14 11:11:00 · 2784 阅读 · 0 评论 -
海战游戏
<br />在N*M的矩阵上,放置了L个军舰,军舰的左上角坐标为ux,uy,左下角坐标为dx,dy。军舰是一个矩形。现在要放置第L+1个军舰,但是军舰不能重叠,并且上下左右,上左,上右,下左,下右都不能相邻。求放置一个长为p,宽为q的军舰的放置方案数(放置方案)。<br />2<=N,M<=30000,L<=30;<br /> <br />朴素的方法。对军舰可以放置的位置进行枚举,并且判断每一个位置是否与其他军舰冲突。时间复杂度为O(MNL)<br /> <br />补集的方法。计算所有冲突的位置,用总放置原创 2011-04-15 11:51:00 · 896 阅读 · 0 评论 -
青蛙的烦恼
<br /> 池塘里有n片荷叶,围成了一个凸多边形。荷叶的编号分别为1,2,3,。。n,n<=1000, 求一种青蛙的跳跃策略,使得青蛙跳过的距离最短,并且遍历了所有的荷叶<br /> 分析:最短距离并非遍历凸多边形的所有的边。例如:A(2 3),B(6 3),C(4 1),D(1 1),四个点组成的凸多边形,最短的遍历路径为ADBC,经过了对角线DB。<br /> <br />使用动态规划解这道题目。子问题为每个节点周围节点数目为1,2,3,..,时候的问题,在解题的过程中,不断的扩大每个节点周原创 2011-05-06 16:38:00 · 1070 阅读 · 0 评论 -
排队
<br />篮球队员身高问题<br /> <br />n个篮球队员,平均身高2000mm,身高范围1950~2050mm。求一个排列,使得对于任意一个给定的k,任意k个连续队员的身高之和与k*2000之差的绝对值小于100<br />方法:首先,预处理,所有的减去2000,有负有正,分为两个数组。初始总值为0.如果总值加上一个正值小于50,则加上该正值,否则,加上一个负值。由于条件的限制,每个数值的绝对值一定是小于50的。最终一定能找到这样一个序列,因为所有的队员的平均身高为0(2000)<br />#in原创 2011-05-06 17:23:00 · 459 阅读 · 0 评论 -
KMP 字符串匹配算法
KMP算法是一种线性时间字符串匹配算法,这个算法不用计算变迁函数,匹配时间为O(n),只用到了辅助函数π,这是在O(m)的时间内根据模式预先计算出来的。 模式的前缀函数π包含有模式与自身的位移进行匹配的信息。简单的来说,如果字符串中某前缀的后缀包含了某前缀,则在比较的时候能够免去对无用位移进行测试。 简单的用java代码实现如下所示package algorithmTraining;public class KMP { public static void ma原创 2011-05-07 21:19:00 · 584 阅读 · 0 评论 -
积木问题
<br /> 有N块积木,我们需要用这些积木造塔。每个塔有H层,最底层包含M块积木;对于上面的每一层,包含的积木块数必须比下面一层的多1或者少1.<br /> 给定输入条件:积木数N,塔的层数H,最底层的积木数M,积木不一定要用完。求方案总数<br /> <br />使用动态规划的方法。同时使用剪枝条件进行剪枝<br />剪枝条件:当前剩余的积木数量不足以构建H层的塔,则终止当前的方案<br /> 当前剩余的积木数量大于所需的最大数量:每层递增1的所有层的和。同时如原创 2011-04-12 17:15:00 · 3088 阅读 · 0 评论 -
整数分解成连续整数之和的方法
<br /> <br />定理:一个数如果可以表示成为连续的正整数之和的形式,则必定包含大于1的奇因子<br /> <br />证明:如果一个数m可以表示成为 a+(a+1)+,...,+(a+k)<br /> 则m=(a+a+k)*(k+1)/2;因为 a+a+k-k-1=2*a-1为奇数,所以m必然包含一个奇因子。<br /> <br />表示法:对于每一个正整数,可以表示成为(奇因子个数)个连续整数的表示。对于每一个奇因子2*k+1,都可以表示成为m=(2*k+1)*n的形式,则m可以原创 2011-05-31 16:04:00 · 2649 阅读 · 0 评论 -
关于图算法的总结
例,01问题求长度为n的01串,满足如下条件1,长为L0的连续子串中0的个数不少A0,不多于B02,长为L1的连续子串中的1的个数不少于A1,不多于B1如果不存在,输出-1这个题可以构造图,然后求图的各点的最短路径。由于上述1,2条件的存在,对于任意的k,用f(k)表示前k串的和则f(k+L0)-f(k)>=L0-b0 f(k+L0)-f(k) f(k+L1)-f(k)>=a1 f(k+L1)-f(k) f(k+1)-f(k)>=0 f(k+1)-f(k)根据由于该算法中权值存在负值,所原创 2010-12-01 10:35:00 · 4458 阅读 · 1 评论 -
一些算法及题目总结
1. 广告排名区间 问题背景 shifen广告消费预估系统可以估计出一段时间内一个特定的广告在检索结果中排在各个位置的几率。比如系统对某广告的输出如下: p1 = 0.03, p2 = 0.08, p3 = 0.04 …… 这说明该广告展现在第1位的概率是 3%,展现在第2位的概率是 8%,展现在第3位的概率是 4%…… 问题是:如何给出一个排名估计区间[i, j],使得广告出现在该区间中的概率大于或等于一个预设值p,同时这个区间所包含的元素尽可能的少。也可用数学语言来描述:给定数p和数列 p1, p2,原创 2010-11-14 17:05:00 · 2997 阅读 · 0 评论 -
关于动态规划算法的总结
动态规划算法,在T大某位老师的书中说就是递推+重复子问题。动态规划算法的效率主要与重复子问题的处理有关。典型的题目有 陪审团,最大公共子串问题1,最大公共子串问题这个是动态规划的基础题目。动态规划就是递推和重复子结构。确定了递推关系后。找到一个能极大地减少重复运算的子结构至关重要。选的好了,时间效率会很好。这个问题,不妨设第一个串为a,长度为n,第二个串为b,长度m。那么最长的子序列长度为f(n,m)当a[n]=a[m]时f(n,m)=1+f(n-1,m-1)否则f(n,m)=max(f(n-1),f(m-原创 2010-11-24 15:42:00 · 11124 阅读 · 3 评论 -
线段树总结
区间有关的问题,如记录一个区间的最值和总量,并在区间的插入,删除修改中维护这些最值和总量,用线段树是很方便的。线段树拥有良好的树形二分特性。详细的概念参考百度百科http://baike.baidu.com/view/670683.htm在实现中,用以下几个变量就足够了。n记录一共用到了多少个节点,B表示每个顶点的线段的起点,E[i]表示每个线段的终点,C是权值,表示某个线段上的权。初始值为0。用lson和rson分别表示左孩子和右孩子实现一个线段树,代码如下#ifndef SegmentTree_H#原创 2011-02-15 15:49:00 · 554 阅读 · 0 评论 -
一些小题目
以前的那篇文章写得太长了,重开一篇1,平面分割问题设有n条封闭曲线画在平面上,任何两条封闭曲线恰好相交于两点,任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。实际上。第n个曲线增加了平面的区域个数为2(n-1)A(n)=A(n-1)+2(n-1),当n=1时,A(1)=2代码简单的递推或者递归都可以实现原创 2011-02-20 21:07:00 · 620 阅读 · 0 评论 -
Raney引理
Raney引理: 设整数序列A={Ai,i=1,2,...,N},且部分和为Sk=A1+,...,+Ak,序列中的所有的数字之和为Sn=1; 则在A的N个循环表示中,有且仅有一个序列B,满足B的任意部分和Si均大于零。证明: 由于Sn=1,则Sk+Sn=Sk+1,存在这样一个数x,当在x和x+1之间的某点过后,其后所有的点都在0以上。 用几何图形来说明就是,用两条线夹住Si的曲线,在每连续N个单位的长度中,直线与函数图像有且仅有一个交点。因为斜率为1/N,原创 2011-05-09 10:53:00 · 2760 阅读 · 0 评论 -
最大公共子串问题
<br /><br />最大公共子串问题<br />这个是动态规划的基础题目。动态规划就是递推和重复子结构。<br />确定了递推关系后。找到一个能极大地减少重复运算的子结构至关重要。选的好了,时间效率会很好。<br />这个问题,不妨设第一个串为a,长度为n,第二个串为b,长度m。那么最长的子序列长度为f(n,m)<br />当a[n]=a[m]时<br />f(n,m)=1+f(n-1,m-1)<br />否则f(n,m)=max(f(n-1),f(m-1))<br />同时建立一个存储计算过的f(x,原创 2011-05-13 16:24:00 · 755 阅读 · 0 评论 -
陪审团问题
<br /> <br />问题描述:<br />问题描述<br />在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中<br />挑选的。先随机挑选n 个人作为陪审团的候选人,然后再从这n 个人中选m 人组成陪审团。<br />选m 人的办法是:<br />控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0 到20。为了公<br />平起见,法官选出陪审团的原则是:选出的m 个人,必须满足辩方总分和控方总分的差的<br />绝对值最小。如果有多种选择方案的辩方总分和控方原创 2011-05-16 15:58:00 · 1386 阅读 · 0 评论 -
小花店问题
F束花从左到右放在V个花瓶里面(1这个题和最大公共子串的思考角度相似。由于花必须要小于等于瓶子。而且花的编号由小到大,不能乱序。例如就不能把出现【2,4】 【1,5】这种现象。也就是说插在花瓶中的花按照花瓶的顺序,序号升序排列。 不妨用f(i,j)来表示把前i朵花插入前个瓶子中。当i=j时,f(i,j)=v[1,1]+v[2,2]+...+v[i,i];当i=0时,f(0,j)=0; 当i!=j, 且i!=0时f(i,j)=max(f(i,j-1),f(i-1,j-1)+v[i,j]) ,i#includ原创 2011-05-16 16:36:00 · 655 阅读 · 0 评论 -
整数划分问题
给定一个自然数,分成k部分,A1,A2..的数的和,要求A1#include #define MaxN 100class SplitToKNum{ public: SplitToKNum() { std::cin>>n; std::cin>>k; memset(f,0,sizeof(f)); for(int i=1;i原创 2011-05-20 16:23:00 · 1118 阅读 · 0 评论 -
中世纪剑士
n个人决斗,两两之间有强弱关系,强弱关系不传递,例如a>b,b>c,c>a。n个剑士围成一个圈,一次抽签,抽中的人和他右边的人决斗,输了的人出圈。现在问是否存在一种决斗方式让第k个人生出,计算可能胜出的的人数和方案。这个题目让我想起了围成一个圈的猴子的题目,那个题目是约瑟夫问题。和这个不一样。这个题目:一个人要胜出,则要胜了所有右边的人,同时也要胜出左边的人。因为是围成一个圈,所以该人胜出的话,最终肯定是自己跟自己相遇。那么,这种情况下,把圈展开成一个链,将该链延长一倍,如果i和i+n可以相遇,则说明i可以原创 2011-05-23 10:51:00 · 1051 阅读 · 0 评论 -
排列问题
<br /> 在整数1,2,...,N的排列中,有些排列满足下面一个性质A:该排列中除了最后一个整数外的每一个整数后面都跟有一个与它相差为1的数字。设有N个数字,已知一部分位置上的数,求满足性质A的排列有多少个?<br /> <br />分析:假设只有一个数字, 即N=1,则满足A条件。若只有两个数字,则一定满足。若有三个数字,不论最后一个数字是什么,满足A条件的后缀序列必然是连续数字组成的集合。例如3个数字的时候,后两个数字不可能为(1,3)。根据这个属性我们设计动态规划算法。<br原创 2011-05-08 16:55:00 · 501 阅读 · 0 评论