2010年7月16日
摘要: A*    一般地,节点n的评估函数f(n)可表示如下        f(n)=h(n)+d(n)  h(n)是启发式函数,与启发信息相关。启发函数h(n)的设计非常重要,它无固定的设计模式,主要取决于面向具体问题结构的知识和求解的技巧。d(n)是开始节点到节点n的深度信息。  A*算法最为核心的部分,就在评估函数的设计。在A*搜索算法的评估函数中,d(n)表示从起始节点到当前节点的代价,通常用当... 阅读全文
posted @ 2010-07-16 13:12 yongmou- 阅读(2653) 评论(0) 推荐(0) 编辑
  2010年7月13日
摘要: 题意:n个整数中间填上+或者-,运算结果能否被k整除。1<=n<=10000, 2<=k<=100思路:虽然不是最优化问题,但确实是DP,刚开始我也没想起了怎么DP。可以把结果mod k看作状态,这样虽然n个数有2^n-1种运算方式,但结果只有k种,所以只需枚举这k个数即可。f(i, j) 表示 前i个数运算结果mod k是否存在余数j,转移方程就简单了:如果f( i-1,... 阅读全文
posted @ 2010-07-13 03:57 yongmou- 阅读(724) 评论(0) 推荐(0) 编辑
  2010年7月12日
摘要: 题意:把一个不超过16位的数字分成m份,求乘积最大值。一个例子:12345拆成两部分,1234|5、123|45......,但是最大值是1234 * 5 = 6170思路:动态规划,f(i, j, t)表示数字的第i位到j位,拆成t部分的最大值。方程:f(i, j, t) = max { f(i, k, 1) * f(k+1, j, t-1) } , k = i..(j-t+1) ;即, t份的... 阅读全文
posted @ 2010-07-12 00:30 yongmou- 阅读(323) 评论(0) 推荐(0) 编辑
  2010年7月11日
摘要: 最长上升子序列问题:给出一个由n个数组成的序列x[1..n],找出它的最长单调上升子序列。即求最大的m和a1,a2……,am,使得a1<a2<……<am且x[a1]<x[a2]<……<x[am]。动态规划求解思路分析:(O(n^2))经典的O(n^2)的动态规划算法,设A[i]表... 阅读全文
posted @ 2010-07-11 21:20 yongmou- 阅读(5635) 评论(0) 推荐(2) 编辑
  2010年7月10日
摘要: [代码] 阅读全文
posted @ 2010-07-10 23:33 yongmou- 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 题意:给出不超过1000头大象的(重量,IQ),其中重量之间可能有相同的,IQ之间也可能有相同的,寻找重量严格递增,IQ严格递减的序列,输出其长度,和序列,序列以输入数据中的序号表示。思路:第一步:对这些大象按照重量排序,排序时,只对索引排序就可以了,不需要动大象的实际数据,比如(600,300,400),对应索引是(1, 2,3)排序后是(2, 3,1)。   第二步:对IQ排序,这需要消去重复... 阅读全文
posted @ 2010-07-10 10:00 yongmou- 阅读(827) 评论(2) 推荐(0) 编辑
  2010年7月9日
摘要: 题意很简单:n个东西,装入容量为c的背包,怎么使装的东西重量和最大。其实,就是价值等于重量的0/1背包问题。  UVa 上规模比较小n最大值是20, 用DP把最大容量设置大点就可以AC,但是JOJ上n最大值是100,又没有告诉容量最大有多大,用DP一用就Runtime Error,在设置大点就Memory Limit Exceeded,只好用DFS搜索了。  DFS搜索的剪枝还挺有技巧性的,其实,... 阅读全文
posted @ 2010-07-09 00:07 yongmou- 阅读(665) 评论(0) 推荐(0) 编辑
  2010年7月8日
摘要: 题意:插入字符来得到回文串,求插入字符最小数目思路:递归方程dp[i][j], 下来三者的最小值:如果str[i] 等于 str[j] 时 dp[i+1][j-1]; dp[i+1][j] + 1(在str[j]后面插入一个与str[i]相同的字符); dp[i][j-1] +1(在str[i]前面插入一个与str[j]相同的字符)。子问题填表,从(0,0)到(n, n)对角线向上填。代码:[代码... 阅读全文
posted @ 2010-07-08 23:44 yongmou- 阅读(387) 评论(0) 推荐(0) 编辑
摘要: 题意:在二维数组中找最长的下降序列,可以向上、下、左、右,四个方向走思路:len[i][j] = max{上,下,左,右},还需要考虑height[i][j]与上下左右的关系。  这个方程的子问题填表方式有两种:一是,迭代方式,用一个结构体记录height[i][j]、i、j,然后对高度排序,然后从小到大填表,这样就能保证填len[i][j]时,其上下左右如果不比   height[i][j]大则... 阅读全文
posted @ 2010-07-08 23:21 yongmou- 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 题意:计算两个DNA碱基序列的相似度,可以插入空格来匹配任一个碱基,题目中给了任意匹配的代价。思路:score[i][j]为下列三者的最大值:seq1[i]与seq2[j]匹配 + score[i-1][j-1];空格与seq1[i]匹配 + score[i-1][j];空格与seq2[j]匹配 + score[i][j-1]。初值,score,第一列表示一直用空格匹配第一个序列,第一行表示一直用... 阅读全文
posted @ 2010-07-08 22:52 yongmou- 阅读(267) 评论(0) 推荐(0) 编辑