05 2011 档案

摘要:问题给定你一个字符串,和n个单词构成的字典。让你求出在字符串中最小删去几个字母,使得剩下的字符串能够由字典中的若干个单词构成。输出最少删去的字母的个数。分析如果考虑第i位的字母,当然只有要和不要两种状态,这是本题的突破口,是划分状态的根本。f[i]表示到第i位最少需要删除的字母的数目。那么得到如下的方程:f[i]:=min{f[i-1]+1,make(i)}不要当前的字母自然不需要解释,直接由相邻的状态更新,无后效性。如果要保留第i位,就需要函数解决。因为第i位的保留就必须有单词能够保留住它,也就会影响和它相邻的状态。当然不能简单地推。至于make函数,如果要保留s[i],必有单词的最后一位恰 阅读全文
posted @ 2011-05-27 17:42 liukee 阅读(586) 评论(1) 推荐(3)
摘要:问题有一列士兵排队,给出其身高a[i],现在要让队列中的一些士兵出列,使得剩下的每个士兵都能够看到对头或队尾(在该士兵和他看到的队尾之间没有比该士兵高的士兵)。现在要求最少的出对的士兵数。分析乍一看很像最长xx序列,但是又没有思路,需要抽象题目中的模型。假设a[i]是满足要求的队列中的元素,那么假设a[1]是左边的对首,a[1]~a[i]中的元素都比a[i]小,也就是说a[1]~a[i]的元素都可以满足要求。那么在a[i]的右边的元素只可能比a[i]大或者小,如果比a[i]小,那么从该元素一直到队尾一定是递减的,才能满足题目要求。这样一来,问题就转化成:在队列a[i]中找到一个元素,使得a[1 阅读全文
posted @ 2011-05-27 17:23 liukee 阅读(443) 评论(0) 推荐(0)
摘要:问题鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的。根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探出头来透透气。你可以控制一个机器人来打鼹鼠,如果i时刻鼹鼠在某个网格中出现,而机器人也处于同一网格的话,那么这个鼹鼠就会被机器人打死。而机器人每一时刻只能够移动一格或停留在原地不动。机器人的移动是指从当前所处的网格移向相邻的网格,即从坐标为(i,j)的网格移向(i-1, j),(i+1, j),(i,j-1),(i,j+1)四个网格,机器人不能走出整个n*n的网格。游戏开始时,你可以自由选定机器人的初始位置。现在你知 阅读全文
posted @ 2011-05-17 12:07 liukee 阅读(633) 评论(0) 推荐(0)
摘要:问题给你一个n个节点的图,让你将该图分成两部分,使得两部分之间的边的权值和最大。分析一开始看以为是图论,但是算法比较高级。再看数据范围只有20,所以只需根据题意枚举一侧的节点即可。用dfs,其实就是生成组合数。注意状态表示和更新的方法,记下当前一共找到了几个点,最后一个点的位置,和当前得到的值。每次新加入一个节点,只需操作和加入的点有关的边即可。有两个剪枝:1.可行性:由于是组合数,只要搜到n div 2 个数即可确定全部情况。注意这句话要放在更新最值的后面。2.最优性:如果当前加入新点之后的值比加之前得到的值大,则继续向下搜索,注意这里不能和当前的最大值比较。(why)该搜索的实质就是找一个 阅读全文
posted @ 2011-05-07 17:39 liukee 阅读(370) 评论(0) 推荐(1)