﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-w2001-随笔分类-算法设计</title><link>http://www.cppblog.com/w2001/category/3880.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 06:12:32 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 06:12:32 GMT</pubDate><ttl>60</ttl><item><title>如何求最长连续公共子序列和最长连续子字符串(zz)</title><link>http://www.cppblog.com/w2001/archive/2007/03/24/20487.html</link><dc:creator>w2001</dc:creator><author>w2001</author><pubDate>Fri, 23 Mar 2007 19:55:00 GMT</pubDate><guid>http://www.cppblog.com/w2001/archive/2007/03/24/20487.html</guid><wfw:comment>http://www.cppblog.com/w2001/comments/20487.html</wfw:comment><comments>http://www.cppblog.com/w2001/archive/2007/03/24/20487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/w2001/comments/commentRss/20487.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/w2001/services/trackbacks/20487.html</trackback:ping><description><![CDATA[
		<p>前段时间研究过如何求最长连续公共子序列和最长连续子字符串，以前一个同学正好问起来，这里贴出来解法：<br />问题的关键还是如何定义子问题，假设有：<br />Xm = x1 x2 x3 ... xm<br />Yn = y1 y2 y3 ... yn</p>
		<p>1. 最长公共子序列(不必连续)<br />定义f(m, n)为Xm和Yn之间最长的子序列的长度<br />于是有f(m, 0) = f(0, m) = 0<br />如果xm != yn, 则f(m, n) = max{ f(m-1, n), f(m, n-1) }<br />如果xm = yn，则f(m, n) = f(m-1, n-1) + 1<br />问题归结于求f(m, n)。依照公式用Bottom-up DP可解。</p>
		<p>2. 最长连续子字符串(必须是连续的)<br />定义f(m, n)为Xm和Yn之间最长的子字符串的长度并且该子字符串结束于Xm &amp; Yn。因为要求是连续的，所以定义f的时候多了一个要求字符串结束于Xm &amp; Yn<br />于是有f(m, 0) = f(0, m) = 0<br />如果xm != yn, 则f(m, n) = 0<br />如果xm = yn, 则f(m, n) = f(m-1, n-1) + 1<br />因为最长字符串不一定结束于Xm / Yn末尾，所以这里必须求得所有可能的f(p, q) | 0 &lt; p &lt; m, 0 &lt; q &lt; n, 最大的f(p, q)就是解。依照公式用Bottom-up DP可解。</p>
		<p>转载自：<a href="http://blog.csdn.net/atfield/archive/2007/01/28/1496132.aspx">http://blog.csdn.net/atfield/archive/2007/01/28/1496132.aspx</a><br /><br />我的补充：最长连续子字符串问题与最大子段和问题有点类似。</p>
<img src ="http://www.cppblog.com/w2001/aggbug/20487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/w2001/" target="_blank">w2001</a> 2007-03-24 03:55 <a href="http://www.cppblog.com/w2001/archive/2007/03/24/20487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最大子矩阵和问题</title><link>http://www.cppblog.com/w2001/archive/2007/03/23/20443.html</link><dc:creator>w2001</dc:creator><author>w2001</author><pubDate>Fri, 23 Mar 2007 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/w2001/archive/2007/03/23/20443.html</guid><wfw:comment>http://www.cppblog.com/w2001/comments/20443.html</wfw:comment><comments>http://www.cppblog.com/w2001/archive/2007/03/23/20443.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/w2001/comments/commentRss/20443.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/w2001/services/trackbacks/20443.html</trackback:ping><description><![CDATA[最大子矩阵和其实是最大子段和问题的二维推广.即给定一个m行n列的矩阵,求其一个子矩阵,行数从r1~r2,列数从c1~c2,使之全部元素之和为最大.<br /><br />我们可以将最大子段和的动态规划解法推广到上述二维情况.其基本思路为,若始行i1与末行i2已给定,则求以i1起始以i2结束的最大子矩阵之和,即等于一个一维的最大子段和问题,只不过这里的数组a中元素a[j]是第j列里从第i1行加到第i2行的所有元素之和. 令t[i1,i2]表示这个行从i1到i2的最大子矩阵和,则求全矩阵的最大子矩阵之和的问题就等于在1&lt;=i1&lt;=i2&lt;=m的范围中使t[i1,i2]最大化.
<p>显然上述算法的时间复杂度为O(m^2*n). 然而,容易看出,整个问题的解决本质上还是一个一维最大子段和的问题,而在另一个维度--行上面,则还是枚举所有的1&lt;=i1&lt;=i2&lt;=m用打擂的方法比较出最大者.也就是说,此方法仍然只是在列这个维度上用到了动态规划.</p><p>有没有可能对两个维度进行联合的动态规划求解呢? </p><img src ="http://www.cppblog.com/w2001/aggbug/20443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/w2001/" target="_blank">w2001</a> 2007-03-23 15:18 <a href="http://www.cppblog.com/w2001/archive/2007/03/23/20443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最大子段和问题的动态规划求解</title><link>http://www.cppblog.com/w2001/archive/2007/03/23/20397.html</link><dc:creator>w2001</dc:creator><author>w2001</author><pubDate>Thu, 22 Mar 2007 18:08:00 GMT</pubDate><guid>http://www.cppblog.com/w2001/archive/2007/03/23/20397.html</guid><wfw:comment>http://www.cppblog.com/w2001/comments/20397.html</wfw:comment><comments>http://www.cppblog.com/w2001/archive/2007/03/23/20397.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/w2001/comments/commentRss/20397.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/w2001/services/trackbacks/20397.html</trackback:ping><description><![CDATA[经典问题，网上误解的很多，分析混乱、说不清楚的也很多，不多写了，<a href="/Files/w2001/最大子段和问题的动态规划求解.rar">附件pdf</a>下载。<img src ="http://www.cppblog.com/w2001/aggbug/20397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/w2001/" target="_blank">w2001</a> 2007-03-23 02:08 <a href="http://www.cppblog.com/w2001/archive/2007/03/23/20397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>算法设计筹备思路</title><link>http://www.cppblog.com/w2001/archive/2007/03/23/20396.html</link><dc:creator>w2001</dc:creator><author>w2001</author><pubDate>Thu, 22 Mar 2007 18:05:00 GMT</pubDate><guid>http://www.cppblog.com/w2001/archive/2007/03/23/20396.html</guid><wfw:comment>http://www.cppblog.com/w2001/comments/20396.html</wfw:comment><comments>http://www.cppblog.com/w2001/archive/2007/03/23/20396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/w2001/comments/commentRss/20396.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/w2001/services/trackbacks/20396.html</trackback:ping><description><![CDATA[1. 目标要高，ACM / ICPC、TopCode，可以到上面去找题目做<br />2. 方向要明确，是算法分析与设计，而不是数据结构<br />3. 基础要扎实、要系统，不能靠网络，知识点太零散，要靠教科书<br />4. 过程中要勤于归纳总结，不能白做，形成一套系统的分析、思考模式<img src ="http://www.cppblog.com/w2001/aggbug/20396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/w2001/" target="_blank">w2001</a> 2007-03-23 02:05 <a href="http://www.cppblog.com/w2001/archive/2007/03/23/20396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>