<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>huojia &#187; 代码</title>
	<atom:link href="http://huojia.b.mumuyin.com/category/%e8%81%8c%e4%b8%9a%e7%94%9f%e6%b6%af/%e4%bb%a3%e7%a0%81/feed/" rel="self" type="application/rss+xml" />
	<link>http://huojia.b.mumuyin.com</link>
	<description>又一个 木木茵博客(B.MuMuYin) Blog</description>
	<lastBuildDate>Thu, 26 Nov 2009 01:58:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Eclipse 3.2 DEBUG JVMJ9TI002E  Error</title>
		<link>http://huojia.b.mumuyin.com/2008/04/22/eclipse-32-debug-jvmj9ti002e-error/</link>
		<comments>http://huojia.b.mumuyin.com/2008/04/22/eclipse-32-debug-jvmj9ti002e-error/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 10:28:32 +0000</pubDate>
		<dc:creator>huojia</dc:creator>
				<category><![CDATA[代码]]></category>
		<category><![CDATA[ecplise]]></category>

		<guid isPermaLink="false">http://mumuyin.com:8000/2008/04/22/eclipse-32-debug-jvmj9ti002e-error/</guid>
		<description><![CDATA[DEBUG-&#62;
JVMJ9TI002E Agent_OnLoad not found in library jdwp
JVMJ9VM015W Initialization error for library j9jvmti23(-3): JVMJ9VM009E J9VMDllMain failed
Could not create the Java virtual machine.
是个Ecplise的bug
https://bugs.eclipse.org/bugs/show_bug.cgi?id=176471
workarounds:

* add dt_socket.dll to system path (does not work if you use different jres
(like me, i run my desktop apps on java6.0 which is in the path, but develop
for 1.4))

* configure a jre as default [...]]]></description>
			<content:encoded><![CDATA[<p>DEBUG-&gt;</p>
<p>JVMJ9TI002E Agent_OnLoad not found in library jdwp<br />
JVMJ9VM015W Initialization error for library j9jvmti23(-3): JVMJ9VM009E J9VMDllMain failed<br />
Could not create the Java virtual machine.</p>
<p>是个Ecplise的bug</p>
<p>https://bugs.eclipse.org/bugs/show_bug.cgi?id=176471</p>
<pre>workarounds:

* add dt_socket.dll to system path (does not work if you use different jres
(like me, i run my desktop apps on java6.0 which is in the path, but develop
for 1.4))

* configure a jre as default instead of a jdk

* copy dt_socket.dll from jdk/jre/bin to jdk/bin</pre>
]]></content:encoded>
			<wfw:commentRss>http://huojia.b.mumuyin.com/2008/04/22/eclipse-32-debug-jvmj9ti002e-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WAS DataSource Support</title>
		<link>http://huojia.b.mumuyin.com/2007/06/19/was-datasource-support/</link>
		<comments>http://huojia.b.mumuyin.com/2007/06/19/was-datasource-support/#comments</comments>
		<pubDate>Tue, 19 Jun 2007 13:56:00 +0000</pubDate>
		<dc:creator>huojia</dc:creator>
				<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://mumuyin.com:8000/2007/06/19/was-datasource-support/</guid>
		<description><![CDATA[

看了两天资料终于搞明白WAS DataSource v5 是怎么工作的了。总结一下，WAS DataSource v5与v4中对DataSource Connection 的管理区别所在。

I.先看看WAS里面是如何访问DataSouce的：

1. An application retrieves a DataSource object from the JNDI naming space.2. After the DataSource object is obtained, the application code callsgetConnection() on the data source to get a Connection object. Theconnection is obtained from a pool of connections.3. Once the connection is acquired, the application sends SQL [...]]]></description>
			<content:encoded><![CDATA[<div><font color="#000000"><br />
</font>
<p>看了两天资料终于搞明白WAS DataSource v5 是怎么工作的了。总结一下，WAS DataSource v5与v4中对DataSource Connection 的管理区别所在。
</p>
<p>I.先看看WAS里面是如何访问DataSouce的：
</p>
<p>1. An application retrieves a DataSource object from the JNDI naming space.<br />2. After the DataSource object is obtained, the application code calls<br />getConnection() on the data source to get a Connection object. The<br />connection is obtained from a pool of connections.<br />3. Once the connection is acquired, the application sends SQL queries or<br />updates to the database.
</p>
<p>WAS6 支持J2EE1.3，J2EE1.4 和 J2EE1.2。这两种类型的区别在于如何管理Connentions.
</p>
<p>II.J2EE 1.3 and J2EE 1.4 DataSource Support(DataSource v5)
</p>
<p>在v5 里，<strong><font color="#ff0000">Connections Pooling 通过 JCA Connection Manager 和 Relation Resource Adapter实现。</font></strong>
</p>
</p>
<p><strong>T</strong><strong>he JCA Connection Manager</strong> provides connection pooling, local transaction,<br />and security support.<br /><strong>The relational resource adapter</strong> provides JDBC wrappers and the JCA CCI<br />implementation that allows BMP, JDBC applications, and CMP beans to access<br />the database.
</p>
<p>在WAS里面，有个叫做Persistence Resouce Adapter的东西来控制DataSource的链接。
</p>
<p>它提供了对EJB的relation persistence bean和对BMP，JDBC application的数据库访问。
</p>
<p>Persistence Resouce Adapter由支持EJB CMP 模型的Persistence Manager 和 <strong>relational resource adapter</strong>  组成。
</p>
<p><strong> Relational Resource Adapter</strong> 是 Persistence Manager 用来控制数据访问的工具，提供了 relational persistence services 给 EJB beans. Relational Resource Adapter的实现 基于J2EE Connector (JCA) 规范 并 实现了JCA CCI 和 SPI 的interfaces.
</p>
<p><a></a>
</p>
<p>现在很明白了，在v5中，应用适用datasource 的时候，datasource 使用JCA来访问关系型数据库。
</p>
<p>EJB的工作顺序如下： <br />1. An EJB performs a JNDI lookup of a data source connection factory and<br />issues a getConnection() request.<br />2. The connection factory delegates the request to a connection manager.<br />3. The connection manager looks for an instance of a connection pool in the<br />application server. If no connection pool is available, then the manager uses<br />the ManagedConnectionFactory to create a physical, or nonpooled,<br />connection.
</p>
<p>III.J2EE 1.2 DataSource Support(DataSource v4)
</p>
<p>区别在于，v4使用了自己的JDBC Connection Manager 来控制Connetion Pooling和JDBC 连接。 This support is included with WebSphere Application Server V6 to provide support for J2EE 1.2 applications. If an application chooses to use a Version 4 data source, the application will have the same connection behavior as in Version 4 of the application server。
</p>
<p><a></a>
</p>
<p>Use the Version 4 data source for the following:<br />&amp;#1; J2EE 1.2 applications<br />All EJB beans, JDBC applications, or Version 2.2 servlets must use the<br />Version 4 data source.<br />&amp;#1; EJB 1.x modules with 1.1 deployment descriptor<br />All of these must use the Version 4 data source
</p>
<p>IV.总结
</p>
<p>在v5中，使用JCA和RA来管理Connections。
</p>
<p>在v4中，适用JDBC Connection Manger来管理Connections.
</p>
<p>具体的实现可以参阅：IBM Ｒed Book -&gt;WebSphere Application Server V6 System Management &amp; Configuration Handbook p345-p365.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://huojia.b.mumuyin.com/2007/06/19/was-datasource-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TICPP-VOL2-习题代码-防御性编程</title>
		<link>http://huojia.b.mumuyin.com/2006/01/27/ticpp-vol2-xi-ti-dai-ma-fang-yu-xing-bian-cheng/</link>
		<comments>http://huojia.b.mumuyin.com/2006/01/27/ticpp-vol2-xi-ti-dai-ma-fang-yu-xing-bian-cheng/#comments</comments>
		<pubDate>Fri, 27 Jan 2006 06:24:00 +0000</pubDate>
		<dc:creator>huojia</dc:creator>
				<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://mumuyin.com:8000/2006/01/27/ticpp-vol2-xi-ti-dai-ma-fang-yu-xing-bian-cheng/</guid>
		<description><![CDATA[//2-1
#include &#34;../TestSuite/Test.h&#34;#include &#60;vector&#62;using namespace std;class VectorTest : public TestSuite::Test{ vector&#60;int&#62; v_Int;public: VectorTest(){
 } void run() {  TestFuc(); } void TestFuc(){        v_Int.push_back(5);  test_(v_Int.front()==5);  test_(v_Int.back() == 5);  test_(v_Int.at(0) == 5);  v_Int.pop_back();  test_(v_Int.size()==0);  try{   v_Int.at(1);   fail_(&#34;invalited pos in vector \n&#34;);  }  catch (std::out_of_range) {
   succeed_();  } }};int _tmain(int argc, _TCHAR* argv[]){ VectorTest obj_Test; obj_Test.run(); obj_Test.report(); getchar(); return 0;}
]]></description>
			<content:encoded><![CDATA[<div>//2-1</div>
<div>#include &quot;../TestSuite/Test.h&quot;<br />#include &lt;vector&gt;<br />using namespace std;<br />class VectorTest : public TestSuite::Test{<br /> vector&lt;int&gt; v_Int;<br />public:<br /> VectorTest(){</div>
<div> }<br /> void run()<br /> {<br />  TestFuc();<br /> }<br /> void TestFuc(){<br />        v_Int.push_back(5);<br />  test_(v_Int.front()==5);<br />  test_(v_Int.back() == 5);<br />  test_(v_Int.at(0) == 5);<br />  v_Int.pop_back();<br />  test_(v_Int.size()==0);<br />  try{<br />   v_Int.at(1);<br />   fail_(&quot;invalited pos in vector \n&quot;);<br />  }<br />  catch (std::out_of_range) {</p>
<p>   succeed_();<br />  }<br /> }<br />};<br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> VectorTest obj_Test;<br /> obj_Test.run();<br /> obj_Test.report();<br /> getchar();<br /> return 0;<br />}</div>
]]></content:encoded>
			<wfw:commentRss>http://huojia.b.mumuyin.com/2006/01/27/ticpp-vol2-xi-ti-dai-ma-fang-yu-xing-bian-cheng/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TICPP-VOL2-习题代码-异常处理</title>
		<link>http://huojia.b.mumuyin.com/2006/01/25/ticpp-vol2-xi-ti-dai-ma-yi-chang-chu-li/</link>
		<comments>http://huojia.b.mumuyin.com/2006/01/25/ticpp-vol2-xi-ti-dai-ma-yi-chang-chu-li/#comments</comments>
		<pubDate>Wed, 25 Jan 2006 07:07:00 +0000</pubDate>
		<dc:creator>huojia</dc:creator>
				<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://mumuyin.com:8000/2006/01/25/ticpp-vol2-xi-ti-dai-ma-yi-chang-chu-li/</guid>
		<description><![CDATA[//////////////////////////////////////////////////////////////  VC2005                                               ////////  Author:Tonyhuo                                    //////////////////////////////////////////////////////////////1-2#include &#60;exception&#62;#include &#60;iostream&#62;using namespace std;class EXAMPLE{public: class CharException{ const char * str_Exception; public:  CharException(const char * msg = 0):str_Exception(msg){}  const char * What(){return str_Exception;} }; void  f() {   throw  CharException(&#34;MY Exception&#34;); }};int _tmain(int argc, _TCHAR* argv[]){ try{        EXAMPLE obj;  obj.f(); } catch(EXAMPLE::CharException&#38; e) {  cout&#60;&#60;e.What()&#60;&#60;endl; } return 0;}///////////////////////////////////////////////////////////////////////////////////1-4#include &#60;exception&#62;#include &#60;iostream&#62;using namespace std;int main(){ try{
 } catch(&#8230;) {  cout&#60;&#60;&#34;All exception caught!&#34;&#60;&#60;endl; }}///////////////////////////////////////////////////////////////////////////////////////1-9//compile by g++#include &#60;exception&#62;#include &#60;iostream&#62;#include &#60;string&#62;using namespace std;class MyException{};class MyException2:public runtime_error{public: MyException2(const string &#38; msg =&#34;&#34;):runtime_error(msg){}};void f(int [...]]]></description>
			<content:encoded><![CDATA[<div>/////////////////////////////////////////////////////////<br />/////  VC2005                                               ////<br />////  Author:Tonyhuo                                    ////<br />////////////////////////////////////////////////////////<br />//1-2<br />#include &lt;exception&gt;<br />#include &lt;iostream&gt;<br />using namespace std;<br />class EXAMPLE{<br />public:<br /> class CharException{<br /> const char * str_Exception;<br /> public:<br />  CharException(const char * msg = 0):str_Exception(msg){}<br />  const char * What(){return str_Exception;}<br /> };<br /> void  f()<br /> { <br />  throw  CharException(&quot;MY Exception&quot;);<br /> }<br />};<br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> try{<br />        EXAMPLE obj;<br />  obj.f();<br /> }<br /> catch(EXAMPLE::CharException&amp; e)<br /> {<br />  cout&lt;&lt;e.What()&lt;&lt;endl;<br /> }<br /> return 0;<br />}<br />///////////////////////////////////////////////////////////////////////////////////<br />1-4<br />#include &lt;exception&gt;<br />#include &lt;iostream&gt;<br />using namespace std;<br />int main()<br />{<br /> try{</div>
<div> }<br /> catch(&#8230;)<br /> {<br />  cout&lt;&lt;&quot;All exception caught!&quot;&lt;&lt;endl;<br /> }<br />}<br />///////////////////////////////////////////////////////////////////////////////////////<br />1-9<br />//compile by g++<br />#include &lt;exception&gt;<br />#include &lt;iostream&gt;<br />#include &lt;string&gt;<br />using namespace std;<br />class MyException{};<br />class MyException2:public runtime_error{<br />public:<br /> MyException2(const string &amp; msg =&quot;&quot;):runtime_error(msg){}<br />};<br />void f(int i) throw(char,int,bool,MyException)<br />{   <br /> switch(i)<br />    {<br />    case 1: throw &#8216;a&#8217;;<br />    case 2: throw 32;<br />    case 3: throw true;<br />    case 4: throw MyException();<br />    case 5: throw MyException2();<br />    } <br />}<br />void my_unexpected()<br />{<br /> throw MyException2(&quot;test&quot;);;<br />}<br />void g() throw(MyException2){<br />    throw 3;<br />}<br />int main()<br />{<br /> for(int j =1;j&lt;=4;j++)<br />  try { f(j);}<br />     catch(char)<br />  {<br />   cout&lt;&lt;&quot;char exception caught&quot;&lt;&lt;endl;<br />  }<br />  catch(int)<br />  {<br />   cout&lt;&lt;&quot;int exception caught&quot;&lt;&lt;endl;<br />  }     <br />  catch(bool)<br />  {<br />   cout&lt;&lt;&quot;bool exception caught&quot;&lt;&lt;endl;<br />  }     <br />  catch(MyException&amp;)<br />  {<br />   cout&lt;&lt;&quot;MyException exception caught&quot;&lt;&lt;endl;<br />  }<br />    set_unexpected(my_unexpected);<br /> try{<br />  g();<br /> }<br /> catch (MyException2&amp;) <br /> {<br />            cout &lt;&lt;&quot;reback from g()&quot;&lt;&lt;endl;<br /> }<br /> getchar();<br /> getchar();<br />}<br />///////////////////////////////////////////////////////////////////////////////////////////<br />1-11<br />#include &lt;exception&gt;<br />#include &lt;iostream&gt;<br />using namespace std;<br />class MotorError{};<br />class Motor{<br />public:<br /> Motor(){throw MotorError();}<br />};<br />class Car{<br />Motor obj_m;<br />public:<br /> Car():obj_m(){}<br />};<br />class Garage{<br />public:<br /> Car obj_c;<br /> Garage() try:obj_c(){</p>
<p> }<br /> catch(MotorError&amp;)<br /> {<br />  cout&lt;&lt;&quot;Car::MotorError&quot;&lt;&lt;endl;<br />  throw 1;<br /> }<br />};<br />int main()<br />{<br /> try<br /> {<br />  Garage obj;<br /> }<br /> catch(int)<br /> {<br />  cout&lt;&lt;&quot;int exception caught&quot;&lt;&lt;endl;<br /> }<br /> getchar();<br />}</div>
]]></content:encoded>
			<wfw:commentRss>http://huojia.b.mumuyin.com/2006/01/25/ticpp-vol2-xi-ti-dai-ma-yi-chang-chu-li/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LCS算法</title>
		<link>http://huojia.b.mumuyin.com/2005/11/30/lcs-suan-fa/</link>
		<comments>http://huojia.b.mumuyin.com/2005/11/30/lcs-suan-fa/#comments</comments>
		<pubDate>Wed, 30 Nov 2005 02:38:00 +0000</pubDate>
		<dc:creator>huojia</dc:creator>
				<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://mumuyin.com:8000/2005/11/30/lcs-suan-fa/</guid>
		<description><![CDATA[
1.最长公共子序列的结构
解最长公共子序列问题时最容易想到的算法是穷举搜索法，即对X的每一个子序列，检查它是否也是Y的子序列，从而确定它是否为X和Y的公共子序列，并且在检查过程中选出最长的公共子序列。X的所有子序列都检查过后即可求出X和Y的最长公共子序列。X的一个子序列相应于下标序列{1, 2, …, m}的一个子序列，因此，X共有2m个不同子序列，从而穷举搜索法需要指数时间。

事实上，最长公共子序列问题也有最优子结构性质，因为我们有如下定理：

定理: LCS的最优子结构性质

设序列X=&#60;x1, x2, …, xm&#62;和Y=&#60;y1, y2, …, yn&#62;的一个最长公共子序列Z=&#60;z1, z2, …, zk&#62;，则：


若xm=yn，则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列；

若xm≠yn且zk≠xm ，则Z是Xm-1和Y的最长公共子序列；

若xm≠yn且zk≠yn ，则Z是X和Yn-1的最长公共子序列。 


其中Xm-1=&#60;x1, x2, …, xm-1&#62;，Yn-1=&#60;y1, y2, …, yn-1&#62;，Zk-1=&#60;z1, z2, …, zk-1&#62;。

证明

用反证法。若zk≠xm，则&#60;z1, z2, …, zk ,xm &#62;是X和Y的长度为k十1的公共子序列。这与Z是X和Y的一个最长公共子序列矛盾。因此，必有zk=xm=yn。由此可知Zk-1是Xm-1和Yn-1的一个长度为k-1的公共子序列。若Xm-1和Yn-1有一个长度大于k-1的公共子序列W，则将xm加在其尾部将产生X和Y的一个长度大于k的公共子序列。此为矛盾。故Zk-1是Xm-1和Yn-1的一个最长公共子序列。

由于zk≠xm，Z是Xm-1和Y的一个公共子序列。若Xm-1和Y有一个长度大于k的公共子序列W，则W也是X和Y的一个长度大于k的公共子序列。这与Z是X和Y的一个最长公共子序列矛盾。由此即知Z是Xm-1和Y的一个最长公共子序列。

与 2.类似。 

这个定理告诉我们，两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列。因此，最长公共子序列问题具有最优子结构性质。
2.子问题的递归结构

由最长公共子序列问题的最优子结构性质可知，要找出X=&#60;x1, x2, …, xm&#62;和Y=&#60;y1, y2, …, yn&#62;的最长公共子序列，可按以下方式递归地进行：当xm=yn时，找出Xm-1和Yn-1的最长公共子序列，然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。当xm≠yn时，必须解两个子问题，即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。

由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。例如，在计算X和Y的最长公共子序列时，可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题，即计算Xm-1和Yn-1的最长公共子序列。

与矩阵连乘积最优计算次序问题类似，我们来建立子问题的最优值的递归关系。用c[i,j]记录序列Xi和Yj的最长公共子序列的长度。其中Xi=&#60;x1, x2, …, xi&#62;，Yj=&#60;y1, y2, …, yj&#62;。当i=0或j=0时，空序列是Xi和Yj的最长公共子序列，故c[i,j]=0。其他情况下，由定理可建立递归关系如下：


3.计算最优值

直接利用(2.2)式容易写出一个计算c[i,j]的递归算法，但其计算时间是随输入长度指数增长的。由于在所考虑的子问题空间中，总共只有θ(m*n)个不同的子问题，因此，用动态规划算法自底向上地计算最优值能提高算法的效率。

计算最长公共子序列长度的动态规划算法LCS_LENGTH(X,Y)以序列X=&#60;x1, x2, …, xm&#62;和Y=&#60;y1, y2, …, yn&#62;作为输入。输出两个数组c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]存储Xi与Yj的最长公共子序列的长度，b[i,j]记录指示c[i,j]的值是由哪一个子问题的解达到的，这在构造最长公共子序列时要用到。最后，X和Y的最长公共子序列的长度记录于c[m,n]中。
Procedure LCS_LENGTH(X,Y);begin  [...]]]></description>
			<content:encoded><![CDATA[<div>
<h4>1.最长公共子序列的结构</h4>
<p>解最长公共子序列问题时最容易想到的算法是穷举搜索法，即对X的每一个子序列，检查它是否也是Y的子序列，从而确定它是否为X和Y的公共子序列，并且在检查过程中选出最长的公共子序列。X的所有子序列都检查过后即可求出X和Y的最长公共子序列。X的一个子序列相应于下标序列{1, 2, …, m}的一个子序列，因此，X共有2<sup>m</sup>个不同子序列，从而穷举搜索法需要指数时间。
</p>
<p>事实上，最长公共子序列问题也有最优子结构性质，因为我们有如下定理：
</p>
<p><b>定理: <a></a></b>LCS的最优子结构性质
</p>
<p>设序列X=&lt;x<sub>1</sub>, x<sub>2</sub>, …, x<sub>m</sub>&gt;和Y=&lt;y<sub>1</sub>, y<sub>2</sub>, …, y<sub>n</sub>&gt;的一个最长公共子序列Z=&lt;z<sub>1</sub>, z<sub>2</sub>, …, z<sub>k</sub>&gt;，则：</p>
<blockquote>
<ol>
<li>若x<sub>m</sub>=y<sub>n</sub>，则z<sub>k</sub>=x<sub>m</sub>=y<sub>n</sub>且Z<sub>k-1</sub>是X<sub>m-1</sub>和Y<sub>n-1</sub>的最长公共子序列；
</li>
<li>若x<sub>m</sub>≠y<sub>n</sub>且z<sub>k</sub>≠x<sub>m ，</sub>则Z是X<sub>m-1</sub>和Y的最长公共子序列；
</li>
<li>若x<sub>m</sub>≠y<sub>n</sub>且z<sub>k</sub>≠y<sub>n</sub> ，则Z是X和Y<sub>n-1</sub>的最长公共子序列。 </li>
</ol>
</blockquote>
<p>其中X<sub>m-1</sub>=&lt;x<sub>1</sub>, x<sub>2</sub>, …, x<sub>m-1</sub>&gt;，Y<sub>n-1</sub>=&lt;y<sub>1</sub>, y<sub>2</sub>, …, y<sub>n-1</sub>&gt;，Z<sub>k-1</sub>=&lt;z<sub>1</sub>, z<sub>2</sub>, …, z<sub>k-1</sub>&gt;。
</p>
<p><b>证明</b></p>
<ol>
<li>用反证法。若z<sub>k</sub>≠x<sub>m</sub>，则&lt;z<sub>1</sub>, z<sub>2</sub>, …, z<sub>k </sub>,x<sub>m </sub>&gt;是X和Y的长度为k十1的公共子序列。这与Z是X和Y的一个最长公共子序列矛盾。因此，必有z<sub>k</sub>=x<sub>m</sub>=y<sub>n</sub>。由此可知Z<sub>k-1</sub>是X<sub>m-1</sub>和Y<sub>n-1</sub>的一个长度为k-1的公共子序列。若X<sub>m-1</sub>和Y<sub>n-1</sub>有一个长度大于k-1的公共子序列W，则将x<sub>m</sub>加在其尾部将产生X和Y的一个长度大于k的公共子序列。此为矛盾。故Z<sub>k-1</sub>是X<sub>m-1</sub>和Y<sub>n-1</sub>的一个最长公共子序列。
</li>
<li>由于z<sub>k</sub>≠x<sub>m</sub>，Z是X<sub>m-1</sub>和Y的一个公共子序列。若X<sub>m-1</sub>和Y有一个长度大于k的公共子序列W，则W也是X和Y的一个长度大于k的公共子序列。这与Z是X和Y的一个最长公共子序列矛盾。由此即知Z是X<sub>m-1</sub>和Y的一个最长公共子序列。
</li>
<li>与 2.类似。 </li>
</ol>
<p>这个定理告诉我们，两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列。因此，最长公共子序列问题具有<a href="http://spaces.msn.com/algorithm/technique/dynamic_programming/chapter3.htm#optimality"><u><font color="#0000ff">最优子结构性质</font></u></a>。</p>
<h4>2.子问题的递归结构</h4>
</p>
<p>由最长公共子序列问题的最优子结构性质可知，要找出X=&lt;x<sub>1</sub>, x<sub>2</sub>, …, x<sub>m</sub>&gt;和Y=&lt;y<sub>1</sub>, y<sub>2</sub>, …, y<sub>n</sub>&gt;的最长公共子序列，可按以下方式递归地进行：当x<sub>m</sub>=y<sub>n</sub>时，找出X<sub>m-1</sub>和Y<sub>n-1</sub>的最长公共子序列，然后在其尾部加上x<sub>m</sub>(=y<sub>n</sub>)即可得X和Y的一个最长公共子序列。当x<sub>m</sub>≠y<sub>n</sub>时，必须解两个子问题，即找出X<sub>m-1</sub>和Y的一个最长公共子序列及X和Y<sub>n-1</sub>的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。
</p>
<p>由此递归结构容易看到最长公共子序列问题具有<a href="http://spaces.msn.com/algorithm/technique/dynamic_programming/chapter3.htm#repeate"><u><font color="#0000ff">子问题重叠性质</font></u></a>。例如，在计算X和Y的最长公共子序列时，可能要计算出X和Y<sub>n-1</sub>及X<sub>m-1</sub>和Y的最长公共子序列。而这两个子问题都包含一个公共子问题，即计算X<sub>m-1</sub>和Y<sub>n-1</sub>的最长公共子序列。
</p>
<p>与矩阵连乘积最优计算次序问题类似，我们来建立子问题的最优值的递归关系。用c[i,j]记录序列X<sub>i</sub>和Y<sub>j</sub>的最长公共子序列的长度。其中X<sub>i</sub>=&lt;x<sub>1</sub>, x<sub>2</sub>, …, x<sub>i</sub>&gt;，Y<sub>j</sub>=&lt;y<sub>1</sub>, y<sub>2</sub>, …, y<sub>j</sub>&gt;。当i=0或j=0时，空序列是X<sub>i</sub>和Y<sub>j</sub>的最长公共子序列，故c[i,j]=0。其他情况下，由<a href="http://spaces.msn.com/mmm2005-11-01_10.54/#th"><u><font color="#0000ff">定理</font></u></a>可建立递归关系如下：
</p>
<p><img height="75" src="http://spaces.msn.com/mmm2005-11-01_10.54/dy1.gif" width="512" border="0" /></p>
<h4>3.计算最优值</h4>
</p>
<p>直接利用(2.2)式容易写出一个计算c[i,j]的递归算法，但其计算时间是随输入长度指数增长的。由于在所考虑的子问题空间中，总共只有<i>θ</i>(<i>m*n</i>)个不同的子问题，因此，用动态规划算法自底向上地计算最优值能提高算法的效率。
</p>
<p>计算最长公共子序列长度的动态规划算法LCS_LENGTH(X,Y)以序列X=&lt;x<sub>1</sub>, x<sub>2</sub>, …, x<sub>m</sub>&gt;和Y=&lt;y<sub>1</sub>, y<sub>2</sub>, …, y<sub>n</sub>&gt;作为输入。输出两个数组c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]存储X<sub>i</sub>与Y<sub>j</sub>的最长公共子序列的长度，b[i,j]记录指示c[i,j]的值是由哪一个子问题的解达到的，这在构造最长公共子序列时要用到。最后，X和Y的最长公共子序列的长度记录于c[m,n]中。
<pre>Procedure LCS_LENGTH(X,Y);begin  m:=length[X];  n:=length[Y];  for i:=1 to m do c[i,j]:=0;  for j:=1 to n do c[0,j]:=0;  for i:=1 to m do    for j:=1 to n do      if x[i]=y[j] then        begin          c[i,j]:=c[i-1,j-1]+1;          b[i,j]:=&quot;↖&quot;;        end      else if c[i-1,j]≥c[i,j-1] then        begin          c[i,j]:=c[i-1,j];          b[i,j]:=&quot;↑&quot;;        end      else        begin          c[i,j]:=c[i,j-1];          b[i,j]:=&quot;←&quot;        end;  return(c,b);end;</pre>
</p>
<p>由于每个数组单元的计算耗费<i>Ο</i>(1)时间，算法LCS_LENGTH耗时<i>Ο</i>(<i>mn</i>)。</p>
<h4>4.构造最长公共子序列</h4>
</p>
<p>由算法LCS_LENGTH计算得到的数组b可用于快速构造序列X=&lt;x<sub>1</sub>, x<sub>2</sub>, …, x<sub>m</sub>&gt;和Y=&lt;y<sub>1</sub>, y<sub>2</sub>, …, y<sub>n</sub>&gt;的最长公共子序列。首先从b[m,n]开始，沿着其中的箭头所指的方向在数组b中搜索。当b[i,j]中遇到&quot;↖&quot;时，表示X<sub>i</sub>与Y<sub>j</sub>的最长公共子序列是由X<sub>i-1</sub>与Y<sub>j-1</sub>的最长公共子序列在尾部加上x<sub>i</sub>得到的子序列；当b[i,j]中遇到&quot;↑&quot;时，表示X<sub>i</sub>与Y<sub>j</sub>的最长公共子序列和X<sub>i-1</sub>与Y<sub>j</sub>的最长公共子序列相同；当b[i,j]中遇到&quot;←&quot;时，表示X<sub>i</sub>与Y<sub>j</sub>的最长公共子序列和X<sub>i</sub>与Y<sub>j-1</sub>的最长公共子序列相同。
</p>
<p>下面的算法LCS(b,X,i,j)实现根据b的内容打印出X<sub>i</sub>与Y<sub>j</sub>的最长公共子序列。通过算法的调用LCS(b,X,length[X],length[Y])，便可打印出序列X和Y的最长公共子序列。
<pre>Procedure LCS(b,X,i,j);begin  if i=0 or j=0 then return;  if b[i,j]=&quot;↖&quot; then    begin      LCS(b,X,i-1,j-1);      print(x[i]); {打印x[i]}    end  else if b[i,j]=&quot;↑&quot; then LCS(b,X,i-1,j)
                      else LCS(b,X,i,j-1);end; </pre>
</p>
<p>在算法LCS中，每一次的递归调用使i或j减1，因此算法的计算时间为<i>O</i>(m+n)。
</p>
<p>例如，设所给的两个序列为X=&lt;A，B，C，B，D，A，B&gt;和Y=&lt;B，D，C，A，B，A&gt;。由算法LCS_LENGTH和LCS计算出的结果如图2所示。
</p>
<div align="center">
<table cellspacing="0" cellpadding="0" border="0">
<tbody>
<tr>
<td valign="center" align="middle" width="30">
</td>
<td valign="center" align="middle">j
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">3
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">4
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">5
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">6
</td>
<td valign="center" align="middle">
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">i
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">y<sub>j</sub>
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">B
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">D
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">C
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">A
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">B
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">A
</td>
<td valign="center" align="middle">
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">┌
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">┐
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">0
</td>
<td valign="center" align="middle">x<sub>i</sub>
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">1
</td>
<td valign="center" align="middle">A
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">←
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">2
</td>
<td valign="center" align="middle">B
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">←
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">←
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">←
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">3
</td>
<td valign="center" align="middle">C
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">←
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">4
</td>
<td valign="center" align="middle">B
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">3
</td>
<td valign="center" align="middle">←
</td>
<td valign="center" align="middle">3
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">5
</td>
<td valign="center" align="middle">D
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">3
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">3
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">6
</td>
<td valign="center" align="middle">A
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">3
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">3
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">4
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">↖
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">↑
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">7
</td>
<td valign="center" align="middle">B
</td>
<td valign="center" align="middle">│
</td>
<td valign="center" align="middle">0
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">1
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">2
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">3
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">4
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">5
</td>
<td valign="center" align="middle">│
</td>
</tr>
<tr>
<td valign="center" align="middle" width="30">
</td>
<td valign="center" align="middle">
</td>
<td valign="center" align="middle">└
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">─
</td>
<td valign="center" align="middle">┘</td>
</tr>
</tbody>
</table>
</div>
</p>
<p align="center"><font size="2">图2   算法LCS的计算结果</font></p>
<h4>5.算法的改进</h4>
</p>
<p>对于一个具体问题，按照一般的算法设计策略设计出的算法，往往在算法的时间和空间需求上还可以改进。这种改进，通常是利用具体问题的一些特殊性。
</p>
<p>例如，在算法LCS_LENGTH和LCS中，可进一步将数组b省去。事实上，数组元素c[i,j]的值仅由c[i-1,j-1]，c[i-1,j]和c[i,j-1]三个值之一确定，而数组元素b[i,j]也只是用来指示c[i,j]究竟由哪个值确定。因此，在算法LCS中，我们可以不借助于数组b而借助于数组c本身临时判断c[i,j]的值是由c[i-1,j-1]，c[i-1,j]和c[i,j-1]中哪一个数值元素所确定，代价是<i>Ο</i>(1)时间。既然b对于算法LCS不是必要的，那么算法LCS_LENGTH便不必保存它。这一来，可节省<i>θ</i>(mn)的空间，而LCS_LENGTH和LCS所需要的时间分别仍然是<i>Ο</i>(mn)和<i>Ο</i>(m+n)。不过，由于数组c仍需要<i>Ο</i>(mn)的空间，因此这里所作的改进，只是在空间复杂性的常数因子上的改进。
</p>
<p>另外，如果只需要计算最长公共子序列的长度，则算法的空间需求还可大大减少。事实上，在计算c[i,j]时，只用到数组c的第i行和第i-1行。因此，只要用2行的数组空间就可以计算出最长公共子序列的长度。更进一步的分析还可将空间需求减至min(m, n)。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://huojia.b.mumuyin.com/2005/11/30/lcs-suan-fa/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>字符串中空格去除PDBD[11.12]</title>
		<link>http://huojia.b.mumuyin.com/2005/11/12/zi-fu-chuan-zhong-kong-ge-qu-chu-pdbd1112/</link>
		<comments>http://huojia.b.mumuyin.com/2005/11/12/zi-fu-chuan-zhong-kong-ge-qu-chu-pdbd1112/#comments</comments>
		<pubDate>Sat, 12 Nov 2005 04:35:00 +0000</pubDate>
		<dc:creator>huojia</dc:creator>
				<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://mumuyin.com:8000/2005/11/12/zi-fu-chuan-zhong-kong-ge-qu-chu-pdbd1112/</guid>
		<description><![CDATA[/*用下划线代表空格aa_bb__ccc应该是碰到第一个_的时候, 就是a后面那个_的时候, 把_和b交换, 就变成aab_b__ccc, 然后我从第一个b继续找_, 然后再交换_和下一个b,  就变成aabb___ccc然后继续找, 下一个非空格是c, 然后交换就变成aabbc___cc这么做下去就把所有空格推到最后了, 这样不用整体移动字符串 , 一次只交换一个字符  */#include &#34;stdafx.h&#34;#include &#34;stdio.h&#34;#include &#34;stdlib.h&#34;#include &#34;string.h&#34;void reblank(char * str){   if(str==NULL)    return;   int length  = strlen(str);   int j;   char temp;   bool inblank  = false;   for(int i=0;i&#60;length;i++)   {     if(str[i]==&#8217; &#8216;)     {           if(!inblank)           {            inblank = true;                j = i ;           }  }     else [...]]]></description>
			<content:encoded><![CDATA[<p>/*用下划线代表空格<br />aa_bb__ccc<br />应该是碰到第一个_的时候, <br />就是a后面那个_的时候, <br />把_和b交换, <br />就变成aab_b__ccc, <br />然后我从第一个b继续找_,<br /> 然后再交换_和下一个b, <br /> 就变成aabb___ccc<br />然后继续找, <br />下一个非空格是c, <br />然后交换就变成aabbc___cc<br />这么做下去就把所有空格推到最后了, <br />这样不用整体移动字符串 , 一次只交换一个字符 <br /> */<br />#include &quot;stdafx.h&quot;<br />#include &quot;stdio.h&quot;<br />#include &quot;stdlib.h&quot;<br />#include &quot;string.h&quot;<br />void reblank(char * str)<br />{<br />   if(str==NULL)<br />    return;<br />   int length  = strlen(str);<br />   int j;<br />   char temp;<br />   bool inblank  = false;<br />   for(int i=0;i&lt;length;i++)<br />   {<br />     if(str[i]==&#8217; &#8216;)<br />     {<br />           if(!inblank)<br />           {<br />            inblank = true; <br />               j = i ;<br />           }<br />  }<br />     else <br />   {<br />        if(inblank)<br />   {<br />             temp  = str[j];   <br />    str[j] = str[i];<br />    str[i] = temp; <br />             inblank = false;<br />    i = j;<br />            }<br />   }</p>
<p>   } <br />   str[i+1] = &#8221;; <br />}<br />int main(int argc, char* argv[])<br />{<br /> char p[]=&quot;he  ll o&quot;;<br /> reblank(p);<br /> printf(&quot;%s\n&quot;,p);<br /> return 0;<br />}</p>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://huojia.b.mumuyin.com/2005/11/12/zi-fu-chuan-zhong-kong-ge-qu-chu-pdbd1112/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
