摘要:
即将奔赴战场这一战必胜 阅读全文
摘要:
图论 很重要的数据结构,noip考试的热点,灵活多变,富有挑战性。 图的存储 邻接矩阵:n2,对稠密图较好,floyd算法的基础,但是在运用时总是需要o(n)的查找,故效率较低,运用的不多仅限数据范围很小时。而且无法处理两点之间多条边的情况(除了最……路)。 前向星:类似邻接表,利用排序将一个点的邻接节点放在一起,再通... 阅读全文
摘要:
感谢赵剑波大牛的原稿,转载于http://blog.sina.com.cn/zhaojianbo0124第一节 动态规划基本概念一,动态规划三要素:阶段,状态,决策。 他们的概念到处都是,我就不多说了,我只说说我对他们的理解:如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作。显然不同阶段是对产品的一个前面各个状态的小结,有一个个的小结构成了最终的整个生产线。每个状态间又有关联(下一个状态是由上一个状态做了某个决策后产生的)。下面举个例子: 要生产一批雪糕,在这个过程中要分好多环节:购买牛奶,对牛奶提纯处理,放入工厂加工 阅读全文
摘要:
问题 有n个人,每两个人都有一个冲突值,将他们分成k组,一旦分在一组就不再产生冲突,问最大的冲突值。 分析 显然,要把冲突值小的人尽可能分在一组。把每两个人的冲突值从小到大排序。之后优先将冲突值小的两个人合并在一起,如果集合个数等于k,则输出当前的冲突值。 用并查集维护。 反思 很像去年的题,要彻底明白,应用并查集这一强大的数据结构 阅读全文
摘要:
问题 给你一个无向图,有n个节点m条双向边,其中有p个节点必须经过,求最短的从1经过这p个节点再到n的最短距离 数据范围 n<=200 p<=12; 分析 先用floyd处理处任意两点之间的最短距离。 之后的得到的距离只于遍历这p个点的顺序有关。 可以搜索,但是12的数据显然超时,考虑使用状态压缩的动态规划。 可以用二进制串m表示状态,1表示这个物品已选,0表示未选。 f[i,j... 阅读全文
摘要:
考试一天天临近,自己的oi之路也在一天天走向终点。 好久没有碰过桌面上的livewriteer 从今天起坚持记录。 留下一段难忘的oi之路。 阅读全文
摘要:
问题在一个n*m的一个方块阵阵地上仅由楼房和街道组成,现在你在(x1,y1)点,伤员在(x2,y2)点,你可以向周围的8个方向移动,也可以爬上一部分楼房。而伤员因为受了伤,动弹不得,你必须背他回来。因此你所最担心的不是你的路程长短,而是你在救援中费的力气的大小。你爬上一幢高为H的楼房,或者从高为H的楼房房顶下来,都需要花费H的力气,而没有高度落差的行走是不费力的。现在你要完成救援的任务,最少要花费多少力气呢?费力最小的情况下,你最少又要走多少路呢?这里上、下楼不算走路。输入数据输入文件的第1行有两个正整数n,m(n,m<=500),第2,3行分别是(x1,y1),(x2,y2)(1< 阅读全文
摘要:
单调队列及其应用关键字队列,合并果子,窗户,广告印刷,最长XX子序列,志愿者选拔,动态规划,烽火传递正文单调队列,望文生义,就是指队列中的元素是单调的。如:{a1,a2,a3,a4……an}满足a1<=a2<=a3……<=an,a序列便是单调递增序列。同理递减队列也是存在的。单调队列的出现可以简化问题,队首元素便是最大(小)值,这样,选取最大(小)值的复杂度便为o(1),由于队列的性质,每个元素入队一次,出队一次,维护队列的复杂度均摊下来便是o(1)。如何维护单调队列呢,以单调递增序列为例:1、如果队列的长度一定,先判断队首元素是否在规定范围内,如果超范围则增长对首。2、每次 阅读全文
摘要:
。问题【题目描述】S航空公司在N座城市之间有N-1条航线,航线是双向的。任意两座城市都是可以互相到达的,但是可能需要在一些城市换乘不同的航线。目前有人抱怨要到达有些城市需要换乘太多次,S航空公司为了缓解这一现状,决定取消目前的一条航线,添加另一条航线,在保证任意两座城市还是可以互相到达的前提下,使得两座城市之间需要乘坐的航线次数的最大值最小。【输入格式】第一行为一个整数N(4<=N<=2500),表示城市的个数。城市从1到N编号。接下来N-1行,每行是一对整数a和b,表示一条连接a和b的航线(1<=a,b<=N)。【输出格式】输出仅一行,即航空公司进行调整后,任意两座城 阅读全文
摘要:
program liukeke;var a:array[0..150] of longint; b:array[0..150] of longint; c:array[0..250] of longint; d:array[0..350] of longint; i,j:longint; s:string;procedure change(s:string);var i:longint;begin for i:=length(s) downto 1 do begin inc(a[0]); a[a[0]]:=ord(s[i])-48; end;end;function work:boolean; 阅读全文
摘要:
问题给定一个长度为n(<=5000)的字符串,求最少添加几个字符使之变成回文串分析设原序列S的逆序列为S',则这道题目的关键在于,最少需要补充的字母数= 原序列S的长度— S和S'的最长公共子串长度设 S 为原字符串,RS=reverse(S)即S反转后的字符串,LCS(S,RS)为S与RS的最长公共子序列,len(S)为S的长度。令S={a1~an},则RS={an~a1},S-LCS(S,RS)={b1~bn},这里的集合都是有序、元素可重复的;bi∈S,RS;且i≠j时,bi≠bj,否则有bi∈LCS(S,RS);同时LCS(S,RS)一定是回文,因为其是在S的正序 阅读全文
摘要:
问题给定你两个基因序列,每个序列中只包含’AGCT’四种字符,长度不一定相等,每个序列都可以在任意位置添上‘-’使之边长,最后使两个序列变成等长,之后相应位置上的字符相互对应可以得到一个分数,现在给出不同的对应得到的分数,规定不使'-’对应。让你求出能够得到的最大的分数。分析很像lcs问题,可以根据lcs写出这样的方程:f[i,j]:=max{f[i-1,j-1]+match(s1[i],s2[j]),f[i-1,j]+match(s1[i],’-’),f[i,j-1]+match(‘-’,s2[j])};怎样来考虑这个问题呢?现在第一个字符串的前i位和第二个串的前j位的最值,之和当前 阅读全文
摘要:
RMQ(Range Minimum/Maximum Query)问题是求区间最值问题。你当然可以写个O(n)的(怎么写都可以吧=_=),但是万一要询问最值1000000遍,估计你就要挂了。这时候你 可以放心地写一个线段树(前提是不写错)应该不会挂。但是,这里有更简单的算法,就是ST算法,它可以做到O(nlogn)的预处理,O(1)地回答每个 询问。 来看一下ST算法是怎么实现的(以最大值为例): 首先是预处理,用一个DP解决。设a[i]是要求区间最值的数列,f[i,j]表示从第i个数起连续2^j个数中的最大值。 例如数列3 2 4 5 6 8 1 2 9 7 ,f[1,0]表示第1个数起,长度 阅读全文
摘要:
第二题描述 Description新一年度的猫狗大战通过SC(星际争霸)这款经典的游戏来较量,野猫和飞狗这对冤家为此已经准备好久了,为了使战争更有难度和戏剧性,双方约定只能选择Terran(人族)并且只能造机枪兵。比赛开始了,很快,野猫已经攒足几队机枪兵,试探性的发动进攻;然而,飞狗的机枪兵个数也已经不少了。野猫和飞狗的兵在飞狗的家门口相遇了,于是,便有一场腥风血雨和阵阵惨叫声。由于是在飞狗的家门口,飞狗的兵补给会很快,野猫看敌不过,决定撤退。这时飞狗的兵力也不足够多,所以没追出来。由于不允许造医生,机枪兵没办法补血。受伤的兵只好忍了。555-现在,野猫又攒足了足够的兵力,决定发起第二次进攻。 阅读全文