POJ1631解题报告

摘要: 这道题目和前面两道是类似的,如果采用相同的方法去解,会出现TLE。前面的方法时间复杂度是O(n^2)的,这道题目,我们要采用的方法是O(nlogn)的。思路想法儿也比较简单,就是在前面方法的基础之上,运用了二分查找。在使用O(n^2)的方法的时候,查找i前边的比它小或者大的时候,是遍历前面每一个元素,并且进行比较。这样,时间复杂度就为O(n^2)。但是,在实现算法的过程中,在计算第i个元素的时候,... 阅读全文
posted @ 2012-02-05 10:27 sing1ee 阅读(294) 评论(0) 推荐(0)

POJ2533解题报告

摘要: 水题一道,分析方法见前一篇博客。代码如下:#include using namespace std;int a[1001], dp[1001];int main() { int n; while (cin >> n) { for (int i = 1; i > a[i]; int max = 0; for (int i = 1; i max) max = dp[i]; } cout 阅读全文
posted @ 2012-02-03 15:44 sing1ee 阅读(105) 评论(0) 推荐(0)

POJ1887解题报告(最长下降子序列)

摘要: 题目说了很长,要求最长下降子序列。题目的输入比较奇怪,需要全部读入之后,再进行dp,否则会TLE(这是我看其他同学说的)。这个题目的递归表达形式(正规一点儿应该叫做:状态转移方程,我太土了)---状态转移方程为:dp[i] = dp[j] + 1 (0 > tmp; if (-1 == tmp) break; int len = 0; a[len++] = tmp; while(1) { ... 阅读全文
posted @ 2012-02-02 22:22 sing1ee 阅读(184) 评论(0) 推荐(0)

POJ3356解题报告(最小编辑距离)

摘要: 给定两个字符串x,y,求得相互之间转换的最小操作次数(最小编辑距离)。dp[i][j]表示x的前i个字符和y的前j个字符的最小编辑距离,与以下三个值有关: dp[i-1][j] dp[i - 1][j - 1] dp[i][j - 1]对于第一个,要求的dp[i][j],要做的是比较x[i]和空(可能是insertion或者deletion,不关注),操作代价为1。对于dp[i][j - 1]同样... 阅读全文
posted @ 2012-02-02 11:33 sing1ee 阅读(179) 评论(0) 推荐(0)

HDU1003解题报告

摘要: 给定一串数字,要求子序列和最大的值。这个子序列是连续的。要不然,就直接选取全是正值的加和即可。我开始很直接的就想到一个O(n^2)的算法,因为子序列又开始位置i和结束位置j。我就定义了一个二维数组,索引就是位置,例如,a[i][j]表示,子序列i到j的和,然后遍历一边二维数组,得到最大的值。代码如下:#include using namespace std;int main() { int ... 阅读全文
posted @ 2012-02-01 23:47 sing1ee 阅读(141) 评论(0) 推荐(0)

POJ2192解题报告

摘要: 这道题目比较有意思,给定三个字符串,判断第三个字符串是不是前两个字符串中的字符组成的,而且,在前两个字符串中的字符要与原串中的顺序一致才行。例如,cat tree cattree就可以,但是tretac就不行了。解决这个我首先想到的是使用递归的方法解决:用三个变量记录三个字符串的扫描位置,初始都是0,然后递归遍历每个字符,判断是否于第三串中相等,相等则游移一位。代码如下:#include #inc... 阅读全文
posted @ 2012-02-01 23:28 sing1ee 阅读(138) 评论(0) 推荐(0)

POJ1080解题报告

摘要: 依旧是如何找到递归表达形式。这个我目前也没有更好的方法,只能遇到一道题目,就解决一道,想不到就抄别人的,变成自己的,积累经验。这道题目中提到的对齐方法,可以任意的加空格,用‘-’表示。那这个情况就比较多了,要怎么处理呢。总结递归表达形式如下,对于任意第一个前i个字符和第二个前j个字符匹配的最大匹配值dp[i][j]可取一下三个之中最大:a[i]第一个字符串的前i个字符,b[i]第二个字符串的前j个... 阅读全文
posted @ 2012-02-01 17:24 sing1ee 阅读(133) 评论(0) 推荐(0)

POJ1159解题报告

摘要: 将一个问题的解决过程,表达为递归的形式,还是挺难的,有的问题递归藏的很深。有的问题本身进行递归,有的却要转换一下,这个是很重要的。POJ1159题,对于一个给定的字符串最少插入几个字符,可以变成一个回文字符串。这道题目,刚刚看,觉得无从下手,因为事先知道使用动态规划解决,要找到解的递归形式,怎么也没想明白(其实是可以的)。后来变换思路,逆向思维,因为要插入一些字符,才能变为回文,那去掉插入的这些字... 阅读全文
posted @ 2012-02-01 14:53 sing1ee 阅读(137) 评论(0) 推荐(0)

Java语言七年之痒

摘要: 我以前一直坚信:语言不是问题,算法与数据结构才是关键!所以,从我刷acm的题目开始,我一直用的是java,因为java我真的是太熟练了。不想浪费时间的语言语法的层面,只想专心算法和数据结构。但是看着程序的运行结果,我动摇了。七年了,我开始动摇了。很多题目,java写出来的,同样的算法,需要几百ms,而c++不到0ms。差距如此之大,我不得不也练练c++了。其实c++之前也学过,基本语法儿也没问题,... 阅读全文
posted @ 2012-01-31 16:20 sing1ee 阅读(192) 评论(0) 推荐(0)

最长公共子序列问题的动态规划解法

摘要: 就我目前学习动态规划的程度,我觉得使用动态规划的方法解决一个问题,最难的是:将问题的解决过程用递归的形式表达出来。使用递归的形式表达出来之后,可以判断是否有重叠的子问题,或者我们在构造递归表达形式的过程中,就会进行判断。另外,可以根据递归的参数,设计数组存储计算的结果,也就是有些博客中提到的填表过程。有很多时候,觉得动态规划解法的代码中,数组运用到很是巧妙,这个主要还是来自递归形式中。 在上一篇的博客中,递归形式其实比较明显。在这一篇,我尝试分析最长公共子序列问题的动态规划解法儿,加深递归表达式产生的过程,也就是自顶向下的分析过程。 最长公共子序列问题:一个数列 S,如果分别是两个或多个已知数 阅读全文
posted @ 2012-01-30 09:10 sing1ee 阅读(338) 评论(0) 推荐(0)