上一页 1 2 3 4 5 6 ··· 8 下一页
摘要: 最长上升/不下降子序列:(LIS)有两种方法:1.动态规划,O(n^2)容易得出O(n^2)的DP递推公式:D[i]=max{D[j]}+1;(1<=j<i且E[j]<E[i])D[i]为以元素i结尾的最长子序列个数。这样经过两重循环一次遍历可以得到最长上升子序列。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 using namespace std; 5 const int maxnum=100; 6 int a[maxnum], 阅读全文
posted @ 2012-08-27 11:01 pushing my way 阅读(324) 评论(0) 推荐(0) 编辑
摘要: 题意:长度为n的01序列,没有相邻的两个1,这种序列有多少种。分析:使用递推来解决,设长度为n的没有相邻1的01序列总数为f[n]。假设序列中最后一个元素为0,则前面n-1个元素只要本身满足没有相邻的两个1就可以,所以最后一个元素为0的情况有f[n-1]种;若最后一个元素为1,则倒数第二个元素必须为0,则前面n-2个元素只要本身满足没有相邻的两个1就可以,所以最后一个元素为1的情况有f[n-2]种。综合这两种情况,得到递推公式f[n]=f[n-1]+f[n-2],婓波拉契数列是一样的。代码:View Code 1 #include <iostream> 2 #include < 阅读全文
posted @ 2012-08-26 18:53 pushing my way 阅读(356) 评论(0) 推荐(0) 编辑
摘要: 算法简介:算法的目的是在O(n)的时间复杂度内找到一个字符串中各个字母所在的最大长度的回文串。此算法用到了一个Rad[]数组的定义,Rad[i]表示回文的半径,即最大的j满足str[i-j+1...i] = str[i+1...i+j]。我们的工作就是把全部的Rad[]求出来。有两个结论:(1):对于一个整数k,如果 (1<=k<=Rad[i] && Rad[i-k] < Rad[i]-k ) 那么,Rad[i+k] = min( Rad[i-k], Rad[i]-k ).(2) : 对于一个整数k,如果 (1<=k<=Rad[i] &&a 阅读全文
posted @ 2012-08-26 17:08 pushing my way 阅读(878) 评论(1) 推荐(0) 编辑
摘要: 题意:给你一串字符,通过添加删除其中的一部分,使其变成一个回文串,并且花费最小(添加删除都有权值)分析:因为删除一个字符和添加一个字符时等价的,所以考虑最小的一种即可,设dp[i][j]表示在区间i j范围内构成回文的最小花费,则:if 当前匹配的两个字符相等,即str[i] == str[j] 那么dp[i][j] = dp[i+1][j-1]else则把左边添加删除一个右边的值或者在右边添加删除一个左边的值 ,取一个最小的即可即:dp[i][j]=min(dp[i+1][j]+cost[str[i]-'a'],dp[i][j-1]+cost[str[j]-'a 阅读全文
posted @ 2012-08-26 16:28 pushing my way 阅读(499) 评论(0) 推荐(0) 编辑
摘要: 题意:给你一段字符串,让你求出在中间最少加入几个字符可以让他变成一段回文子串。分析::假设S是一段字符串,S'是S的逆串,则只需求出S与S'的最长公共子序列即可的长度即可,最后用字符串的长度减去最长公共子序列的长度即是这道题目所求的加入的字母的长度。转化为LCS问题即可。注意:1.此题二维数组会超内存,65536k=1.6*10^7(int),而二维数组2.5*10^7,显然超内存。但是用short型可以过。2.可以使用滚动数组,因为题目只要求最后结果,没有对过程深度考察,这里可以在纸上简单模拟一下DP的转移过程.确定好最少行数或者列数之后,重点就是在如何进行"滚动& 阅读全文
posted @ 2012-08-26 12:08 pushing my way 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 题意:两颗苹果树每一分钟会有树落下苹果,有人去接,但是来回两个树之间的次数是一定的,所以求出在最大次数时最多能接到多少苹果。分析:设dp[i][j]表示在时间i内,已经来回了j次时得到的最大苹果数目。初始化dp[1][0]=1 if(array[1]==1) dp[1][1]=1;状态转移方程:dp[i][j]=dp[i-1][j]+array[i]%2 (j==0)dp[i][j]=max(dp[i][j],dp[i-1][j-1]+(array[i]==j%2+1)); (j<=i)dp[i][j]=max(dp[i][j],dp[i-1][j]+(array[i]==j%2+1)) 阅读全文
posted @ 2012-08-26 11:02 pushing my way 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 题意:长篇大论就是构建正反两个图,然后将正反图中各点距离源点的最短距离相加。分析:spfa和邻接表,注意答案得用long long 存啊。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <queue> 5 using namespace std; 6 //spfa 7 //58924K 1625MS 8 const int maxnum=1000005; 9 const int maxdigit=1000000000; 阅读全文
posted @ 2012-08-24 16:02 pushing my way 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的。分析:参考http://blog.csdn.net/lyy289065406/article/details/6647445可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点,把木棒看成边,这样相同的颜色就是同一个节点问题便转化为:给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次。这样就是求图中是否存在欧拉路Euler-Path。由图论知识可以知道,无向图存在欧拉路的充要条件为:① 图是连通的;② 所有节点的度为偶数,或者有且只有两个度为奇数的节点。 阅读全文
posted @ 2012-08-24 12:49 pushing my way 阅读(699) 评论(0) 推荐(0) 编辑
摘要: 笛卡尔树又称笛卡儿树,在数据结构中属于二叉树的一种。笛卡尔树结构由Vuillmin在解决范围搜索的几何数据结构问题时提出的,从数列中构造一棵笛卡尔树可以线性时间完成,需要采用基于栈的算法来找到在该数列中的所有最近小数。由此可知,笛卡尔树是一种特定的二叉树数据结构,可由数列构造,在范围最值查询、范围top k查询(range top k queries)等问题上有广泛应用。它具有堆的有序性,中序遍历可以输出原数列。笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key,一个为value。光看key的话,笛卡尔树是一棵二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大;光看value的 阅读全文
posted @ 2012-08-24 09:52 pushing my way 阅读(5254) 评论(0) 推荐(1) 编辑
摘要: 题意:求从每个入度为零的点走到唯一的一个出度为零的点的所有走法中,经过次数最多的一条边被经过的次数,输入为点数和边数。例如:7 71 33 43 54 62 35 66 7ans:4Here are the four possible paths that lead to the barn: 1 3 4 6 7 1 3 5 6 7 2 3 4 6 7 2 3 5 6 76-->7 maxnum=4分析:设start_routes[i] 为入度为0的源点到节点i的路径条数, end_routes[i] 为节点i到汇点N的路径条数。首先通过toposort求出上述两个变量,然后枚举每条边(s 阅读全文
posted @ 2012-08-23 19:05 pushing my way 阅读(288) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 ··· 8 下一页