POJ1050解题报告

摘要: 这是HDU1003题目的扩展,一维扩展到二维。HDU1003解题思路很简单,但是如果要记录起始位置的话,需要额外两个数组。HDU1003中,设dp[i]表示以第i个数结尾的子序列中,和最大的值,状态转移方程为:dp[i] = max(dp[i - 1) + a[i], a[i])刚刚看到POJ1050这个题目,也想着顺着这个思路扩展,但是不得其解,无法构造状态转移方程。后来看了别人的解题报告,才恍... 阅读全文
posted @ 2012-02-07 14:42 见路非道 阅读(210) 评论(0) 推荐(0)

POJ1088解题报告

摘要: 今天是元宵节,外面的鞭炮声很大。元宵晚会已经成了那些人的KTV了。我还是总结一下白天的题目好了。POJ1088是一道在二维数组上的最长下降子序列或者最长上升子序列问题。很自然会用h[i][j]来表示到(i,j)位置的最长上升子序列的长度。考虑状态转移方程,与之有关系的是: h[i - 1][j] h[i][j - 1] h[i + 1][j] h[i][j + 1]状态转移方程如下:h[i][j]... 阅读全文
posted @ 2012-02-06 21:04 见路非道 阅读(180) 评论(0) 推荐(0)

POJ1157解题报告

摘要: 通过这个题目,对自顶向下分析,有了进一步的理解。题意如下表:Vases(j)12345Bunches(i)1723-5-24162521-410233-215-4-20201,2,3行代表三束花,1,2,3,4,5列代表这么多列的花瓶,要把三束花放到花瓶中,满足一下几个条件: 不同的花要出现在不同的列 j1表示1号花放的列,依次。保证j1<j2<j3 最重要的,要保证三个位置上的数字和最大。分析这... 阅读全文
posted @ 2012-02-05 21:13 见路非道 阅读(158) 评论(0) 推荐(0)

POJ1631解题报告

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

POJ2192解题报告

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

POJ1080解题报告

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