2012年8月18日

poj1934(最大公共子数列)

摘要: 这道题完全没有思路。唉,可悲看了大牛的思路才发现,人才啊,都是人才啊我拿过来学习下这道题大致分为三个步骤1 求最大公共子串(LCS),这个应该是比较简答的方法,主要是动态转移方程,这里设i,j是字符串a,b的下标,dp[i][j]表示a的0~i ,b的0~j的最大公共子串 动态转移方程分为两种情况: (1)a[i]==b[j] dp[i][j]=dp[i-1][j-1]+1; (2)a[i]!=[j] dp[i][j]=max(dp[i-1][j],dp[i][j-1]);2用两个变量last1[i][j], last2[i][j]来分别保存字符j(a的序号为0,b的序号为1,.....z的序 阅读全文

posted @ 2012-08-18 23:37 矮人狙击手! 阅读(598) 评论(0) 推荐(0) 编辑

LCS

摘要: 关于最大公共子序列,自己写了个程序程序只要输入两个字符串就ok了一直不明白:最长公共子串和最长公共子序列的区别。 上网查了下,最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续 1 #include 2 #include 3 #include 4 using namespace std; 5 char a[2005]; 6 char... 阅读全文

posted @ 2012-08-18 21:26 矮人狙击手! 阅读(269) 评论(0) 推荐(0) 编辑

poj1014(背包问题)

摘要: 这道题个人觉得至少有三种解法,第一种背包,第二种dfs,第三种母函数这道题我用的是背包问题来求的,首先这个问题是多重背包问题,看了背包九讲,多重背包可以转化为01背包,这道题继续把他转化了,因为如果数据过大,效率就得不到保证,为了提高效率,采用了二进制拆分的方法,关于二进制拆分的方法简答来说是这样的:假设原来某一种类的珠宝数量为N,我们可以把N拆成1,2,4,8,……,2^(k-1),N-2^k+1。这些拆分成的数字能够表示1~N之间的任何一个数。这样,我们就把物品数减小为logN(以2为底,向上取整)。这样把原来的物体转化为了一个一个的单位,以单位计算,这样就成功的把多重背包问题转化为了纯粹 阅读全文

posted @ 2012-08-18 17:20 矮人狙击手! 阅读(2730) 评论(0) 推荐(0) 编辑

多重背包二进制优化

摘要: 转自:http://blog.csdn.net/ronhou/article/details/7738014取模优化当输入样本特别大时,比如给出上百万件物品,这时候仅靠优化算法仍然不能使运行时间降到满意的范围。可考虑如何减少输入样本。poj1014的discussion上有一个非常巧妙的“取模优化”法。设价值为v(1<=v<=6)的物品共有n件,我们希望找到一个比较小的数s(s<n), 且将n件物品v减少到s或s-1件,问题的可分性不变。考虑不可分和可分两种情况:如果该问题不可分,那么n-2件v仍然不可分,依次类推,用s或 s-1替换n仍然不可分如果该问题可分,即可分成价值相 阅读全文

posted @ 2012-08-18 15:32 矮人狙击手! 阅读(963) 评论(0) 推荐(0) 编辑

一位ACMer过来人的心得

摘要: 转自:http://blog.csdn.net/lyy289065406/article/details/6642572刻苦的训练我打算最后稍微提一下。主要说后者:什么是有效地训练?我想说下我的理解。很多ACMer入门的时候,都被告知:要多做题,做个500多道就变牛了。其实,这既不是充分条件、也不会是必要条件。我觉得一般情况下,对于我们普通学校的大学生,各方面能力的差距不会太大,在这种情况下,训练和学习的方法尤为重要。其实,500题仅仅是一个标志,而且仅仅表示你做ACM-ICPC有一定的时间,我们训练的目的是什么?我觉得有四点1、提高编程能力2、学习算法,(读书,读论文,包括做一些题目验证)3 阅读全文

posted @ 2012-08-18 13:34 矮人狙击手! 阅读(4951) 评论(0) 推荐(2) 编辑

poj1189

摘要: 题意:在一块木板上,钉上钉子,排布成等边三角形。一个球从顶部开始,自由下落。每碰到一个钉子以后,等概率地向两边继续滚。现从该等边三角形的钉子中,拔去其中某些钉子。求这个球从顶部开始下落,滚到底部某个格子的概率。思路:DP模拟。逐步递推,分别计算每一层,滚到每一个口的概率。最后一层每个口的概率,就是对应底部每个格子的概率。每一个口的概率,若遇到一个钉子,则除以2后就是下一层对应两个口的概率;若没遇到钉子,则直接等于再下层的对应入口,即直接落下。一开始的初值,就是2^层数,即全部都是钉子时,第一个格子对应的概率。 1 #include <iostream> 2 #include < 阅读全文

posted @ 2012-08-18 10:31 矮人狙击手! 阅读(557) 评论(0) 推荐(0) 编辑

导航