<?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>::SinRain&#039;s Blog:: &#187; LCS</title>
	<atom:link href="http://www.sinrain.cn/tag/lcs/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sinrain.cn</link>
	<description>Simple Dream Easy Go~</description>
	<lastBuildDate>Wed, 28 Jul 2010 09:30:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>再说Common Sub-sequence</title>
		<link>http://www.sinrain.cn/2009/09/04/%e5%86%8d%e8%af%b4common-sub-sequence/</link>
		<comments>http://www.sinrain.cn/2009/09/04/%e5%86%8d%e8%af%b4common-sub-sequence/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 01:15:32 +0000</pubDate>
		<dc:creator>Rain</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[赛先生]]></category>
		<category><![CDATA[Code Jam]]></category>
		<category><![CDATA[LCS]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.sinrain.cn/2009/09/04/%e5%86%8d%e8%af%b4common-sub-sequence/</guid>
		<description><![CDATA[在之前的一个文里有谈及到过最长公共字序列的问题，这个可以用来衡量俩个序列的相似度。
今年的Goolge Code jam的qualification Round 也有一道类似的问题：
【Sub-Sequence-Match】x=[]是一序列，y=[]是... ]]></description>
			<content:encoded><![CDATA[<p>在之前的一个文里有谈及到过最长公共字序列的问题，这个可以用来衡量俩个序列的相似度。</p>
<p>今年的Goolge Code jam的qualification Round 也有一道类似的问题：</p>
<blockquote><p>【Sub-Sequence-Match】x=[]是一序列，y=[]是另一序列：问x中共有多少个不同的子序列等于y</p>
</blockquote>
<p>和这个问题有一点类似的问题是IJCAI07的一篇文里提到的：</p>
<blockquote><p>【All-Common-Subquence】x=[]是一序列，y=[]是另一序列：问x，y共有多少个不同的公共子序列</p>
</blockquote>
<p>想法还是DP:</p>
<blockquote><p><strong>For S-S-M:</strong></p>
<p>def f(x,y):     <br />&#160;&#160;&#160; if len(x)&lt;len(y):      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 0      <br />&#160;&#160;&#160; if len(y)==1:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; count=0      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; for k in x:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if k==y:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; count=count+1      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return count      <br />&#160;&#160;&#160; a=len(x)      <br />&#160;&#160;&#160; b=len(y)      <br />&#160;&#160;&#160; if x[a-1]==y[b-1]:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return f(x[0:a-1],y[0:b-1])+f(x[0:a-1],y[0:b])      <br />&#160;&#160;&#160; if x[a-1]!=y[b-1]:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return f(x[0:a-1],y[0:b])</p>
</blockquote>
<p>意思就是：   <br />如果x长度比y小，那么返回0；如果长度y=1了，那么就看x串中有几个y，返回这个个数；    <br />不然的话    <br />如果最后一个元素相等，那么让x’为x去掉最后一个元素的序列，y’为y去掉最后一个元素序列：    <br />返回s-s-m(x’,y’)+s-s-m(x’,y)</p>
<p>如果最后一个元素不等，那么直接返回s-s-m(x’,y)</p>
<p>当然可以把上面的递归改写成递推的，这样效率会大大提高，并且不改的话，Code jam的大数据肯定是要会TLE的，改写起来很简单就不写鸟。</p>
<p>再来看看A-C-S的DP，大家基本可以自己想想就可以解决了，和上面的思路很类似</p>
<blockquote><p>N(i, j) = N(i − 1, j − 1) × 2, if Ai = Bj     <br />N(i, j) = N(i − 1, j) + N(i, j − 1) − N(i − 1, j − 1),      <br />if Ai!= Bj</p>
</blockquote>
<p>如果最后的元素相同，实际就是前面的A-C-S(i-1,j-1)×2.（有或没有最后一个item作为CS的一部分）   <br />不然的话等于下面那个，注意要扣除掉重复计算的A-C-S(i-1,j-1)</p>
<p>E-O-F</p>
<p>&copy;2010 <a href="http://www.sinrain.cn">::SinRain&#039;s Blog::</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.sinrain.cn/2009/09/04/%e5%86%8d%e8%af%b4common-sub-sequence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
