摘要: 题意:长度为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) 编辑