<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[吟弓阁 执子之手 与子偕老]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[死生契阔 与子成说 执子之手 与子偕老]]></description>
<link>http://hi.baidu.com/sixstar</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[blog要搬家了]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/28a27fed169830d3b21cb16e.html]]></link>
        <description><![CDATA[
		
		<p>博客转到sina去了，一方面不再OI了，也就不再写题解了，大学也不想继续从事计算机</p>
<p>另一方面，写东西是为了有读者看，sina的读者大概是最多的吧（恕我孤陋寡闻）。</p>
<p>新地址在
<table class="bannerContent FCK__ShowTableBorders" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td class="blogUrl">
            <div><a class="link" href="http://blog.sina.com.cn/cxh757">http://blog.sina.com.cn/cxh757</a></div>
            </td>
        </tr>
        <tr>
            <td colspan="2"> </td>
        </tr>
    </tbody>
</table>
</p>
<p>至于这里的以后还会不会再更新，恐怕现在还没办法回答，感谢曾经的访客们的支持，再见。</p>
<div style="left: 55px; width: 272px; top: 72px; height: 60px"> </div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/28a27fed169830d3b21cb16e.html#comment">查看评论</a>]]></description>
        <pubDate>2009年01月27日 星期二  下午 05:18</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/28a27fed169830d3b21cb16e.html</guid>
</item>

<item>
        <title><![CDATA[北朝鲜纪实 第一集-走向个-人-崇-拜]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/a53a24df6cb5cd146327981c.html]]></link>
        <description><![CDATA[
		
		<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/TqKN6rSM8Fk" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p> </p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/STC1Pr-CxXk" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/DuByO5T-_cY" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/a36YD9ft1_M" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/Dc7mTGTwhwQ" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/g_M43vQ-MA8" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/%B1%B1%B3%AF%CF%CA%BC%CD%CA%B5">北朝鲜纪实</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/a53a24df6cb5cd146327981c.html#comment">查看评论</a>]]></description>
        <pubDate>2008年12月01日 星期一  下午 05:37</pubDate>
        <category><![CDATA[北朝鲜纪实]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/a53a24df6cb5cd146327981c.html</guid>
</item>

<item>
        <title><![CDATA[330，不知是华丽还是平庸的谢幕]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/410fdec40ddd65ae8226acd3.html]]></link>
        <description><![CDATA[
		
		<p>三年的辛酸苦辣，全都化作漫天的过眼云烟，梦里的三千落花</p>
<p>无论考后考前，都没了从前的紧张与不安，下午独坐在福大赛场，闪过脑海的只有往昔的串串依恋</p>
<p>虽然福建并列第8在外人看起来很是好听，但我不清楚自己是否要的就是这个结局</p>
<p>或许它并不是个结局，而是开始</p>
<p>回程的公交上，看到了师大附中的男生的默默啜泣，我仿佛透视到了从前自己那颗同样脆弱的心</p>
<p>如果说OI除了省一和保送外还能带给你什么，那我觉得就是磨砺</p>
<p>或许我自出生起缺乏的就是坚强，太多的温文恭良让，太多的一帆风顺，心里少确了许多挫败后的结痂</p>
<p>脸上没有伤痕的剑客，大都是沽名钓誉的花花公子罢了</p>
<p>&ldquo;十年磨一剑，霜刃未曾试，今朝把示君，谁有不平事？&rdquo;</p>
<p>这真的是人生中一段不平凡的经历，我会永远记住它的</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/%D2%F7%B9%AD%B8%F3%B1%CA%BC%C7%2D%2D%D2%F7%B9%AD%B8%F3%CB%E6%B1%CA">吟弓阁笔记--吟弓阁随笔</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/410fdec40ddd65ae8226acd3.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月16日 星期日  上午 08:45</pubDate>
        <category><![CDATA[吟弓阁笔记--吟弓阁随笔]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/410fdec40ddd65ae8226acd3.html</guid>
</item>

<item>
        <title><![CDATA[DP归纳（改写自OIBH）最小最大问题(MINMAX)]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/6d2bcddc59f7a4a6cc116671.html]]></link>
        <description><![CDATA[
		
		<p>与求图的最长路径相同，给出的图需是有向而无环的，才能求它的最小最大问题</p>
<p><span style="font-size: 10.5pt;  mso-bidi-font-size: 12.0pt; mso-ascii- mso-hansi- mso-bidi- mso-font-kerning: 1.0pt; mso-ansi- mso-fareast- mso-bidi-">定义<span style="font-size: 10.5pt;  mso-bidi-font-size: 12.0pt; mso-ascii- mso-hansi- mso-bidi- mso-font-kerning: 1.0pt; mso-ansi- mso-fareast- mso-bidi-">一条路径的瓶颈<span style="font-size: 10.5pt;  mso-bidi-font-size: 12.0pt; mso-ascii- mso-hansi- mso-bidi- mso-font-kerning: 1.0pt; mso-ansi- mso-fareast- mso-bidi-">为该路径上的边的权值的最大值或最小值，<font face="Arial">最小最大问题就是求它的瓶颈</font></span></span></span></p>
<p> </p>
<div forimg="1">
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/sixstar/pic/item/19d28245ed9ab13acffca303.jpg"></p>
<p> </p>
<p>它的动规模型：</p>
<p>Ｆ［Ｉ，Ｊ］＝ＭＩＮ　（　ＭＡＸ（Ｆ［Ｉ，Ｋ］，Ｇ［Ｋ，Ｊ］））</p>
<p>求路径最长边的小值，初值Ｇ［Ｉ，Ｊ］＝∞　Ｆ［Ｉ，Ｊ］＝∞　Ｆ［Ｉ，Ｊ］＝Ｇ［Ｉ，Ｊ］（如果Ｉ＼Ｊ有直连）</p>
<p>  for k:=1 to 10 do<br>
  for i:=1 to 10 do<br>
  for j:=1 to 10 do<br>
  if (i&lt;&gt;j)and(j&lt;&gt;k)and(i&lt;&gt;k)  then<br>
  if max(f[i,k],g[k,j]) &lt;f[i,j] then<br>
  f[i,j]:=max(f[i,k],g[k,j]);</p>
<p>或是</p>
<p>Ｆ［Ｉ，Ｊ］＝ＭＡＸ　（　ＭＩＮ（Ｆ［Ｉ，Ｋ］，Ｇ［Ｋ，Ｊ］））</p>
<p>求路径最短边的大值，初值Ｇ［Ｉ，Ｊ］＝－∞　Ｆ［Ｉ，Ｊ］＝－∞　Ｆ［Ｉ，Ｊ］＝Ｇ［Ｉ，Ｊ］（如果Ｉ＼Ｊ有直连）</p>
<p> for k:=1 to 10 do<br>
 for i:=1 to 10 do<br>
 for j:=1 to 10 do<br>
 if (i&lt;&gt;j)and(j&lt;&gt;k)and(i&lt;&gt;k)  then<br>
 if mIN(f[i,k],g[k,j]) &gt;f[i,j] then<br>
 f[i,j]:=min(f[i,k],g[k,j]);</p>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/dp%B9%E9%C4%C9">dp归纳</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/6d2bcddc59f7a4a6cc116671.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月12日 星期三  下午 07:38</pubDate>
        <category><![CDATA[dp归纳]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/6d2bcddc59f7a4a6cc116671.html</guid>
</item>

<item>
        <title><![CDATA[DP归纳（改写自OIBH）最佳覆盖问题(COV)]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/c891dc501151d85b1038c2fd.html]]></link>
        <description><![CDATA[
		
		<p>最佳覆盖问题是经典的线形规划类型，通常是给定一排任务（或物品），你需要将其分为Ｋ个部分，通常Ｋ＜＝Ｎ，分出部分时通常有一定的花费，你需要让总费用最大或最小</p>
<p>其一般动态模型为</p>
<p>Ｆ［Ｉ，Ｊ］＝ＭＩＮ（　Ｆ［Ｉ－１，Ｋ－１］+ＳＵＭ［Ｉ，Ｊ］　）</p>
<p>初值Ｆ［Ｉ，Ｊ］＝∞　Ｆ［０，０］＝０　ＳＵＭ［Ｉ，Ｊ］是把物品Ｉ到Ｊ分在一起的花费，它通常的时间复杂度是（Ｋ*Ｎ＾２）的</p>
<p>例题：</p>
<p>给定k个大小不同的灌木丛，它们因为霜冻需要保护。假定这些灌木丛按照大小排序，即灌木丛0是最小的，灌木丛k-1是最大的。这里把为灌木丛i制作覆盖层的花费记作ci。但是由于制造技术上的局限，最多只能制造n种不同大小的保护层，这里n＜＝k。较大的覆盖层能够保护较小的灌木丛。我们的目标是决策n个保护层的大小，使之能以最小的花费覆盖所有的灌木丛。</p>
<p>我们来看这样一个例子：有k = 10个灌木丛，每种大小的覆盖层的花费<br>
为(c0; :::; c9) = 1; 4; 5; 7; 8; 12; 13; 18; 19; 21),且由于技术局限，只能制作n = 3种<br>
大小的覆盖层。那么最佳的方案就是依次制造出大小为9,6,4的覆盖层(即使用大<br>
小为9的覆盖层保护灌木丛9,8,7，用大小为6的覆盖层保护灌木丛6和5，用大小<br>
为4的覆盖层保护灌木丛0至灌木丛4)，其总花费f(3; 9) = 129</p>
<p>program cov;<br>
var c:array[0..10] of longint;<br>
&nbsp;&nbsp;&nbsp;  f:array[0..3,0..10] of longint;<br>
&nbsp;&nbsp;&nbsp;  i,j,k:longint;<br>
begin<br>
  for i:=1 to 10 do read(c[i]);<br>
  fillchar(f,sizeof(f),$7f);<br>
  f[0,0]:=0;<br>
  for i:=1 to 3 do<br>
  for j:=i to 10 do<br>
  for k:=i to j do<br>
  if not((i=1)and(k&lt;&gt;1)) then<br>
  if f[i-1,k-1]+(j-k+1)*c[j]&lt;f[i,j] then<br>
  f[i,j]:=f[i-1,k-1]+(j-k+1)*c[j];<br>
  writeln(f[3,10]) ;<br>
end.</p>
<p> </p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/dp%B9%E9%C4%C9">dp归纳</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/c891dc501151d85b1038c2fd.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月12日 星期三  下午 03:40</pubDate>
        <category><![CDATA[dp归纳]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/c891dc501151d85b1038c2fd.html</guid>
</item>

<item>
        <title><![CDATA[DP归纳（改写自OIBH）最优二叉搜索树问题(BST)]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/a7ed87fbbf4873254f4aea19.html]]></link>
        <description><![CDATA[
		
		<p>最优二叉搜索树问题是指已给出一株二叉树的中序遍历（或需要你全排列枚举），以及每个结点搜索概率，搜索到一层花费１，问如何安排这棵二叉树使搜索花费的期望值最小</p>
<p>这类问题的花费通常定义为结点权值乘以结点所在深度</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><span style="mso-spacerun: yes"> </span>p0*level(x0)+p1*(level(x1))+…pn-1*(level(xn-1))　<span style="font-size: 10.5pt;  mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ascii- mso-hansi- mso-bidi- mso-ansi- mso-fareast- mso-bidi-">这里</span><span style="font-size: 10.5pt;  mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-fareast- mso-ansi- mso-fareast- mso-bidi-">level(xi)</span><span style="font-size: 10.5pt;  mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ascii- mso-hansi- mso-bidi- mso-ansi- mso-fareast- mso-bidi-">表示数据项</span><span style="font-size: 10.5pt;  mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-fareast- mso-ansi- mso-fareast- mso-bidi-">xi</span><span style="font-size: 10.5pt;  mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ascii- mso-hansi- mso-bidi- mso-ansi- mso-fareast- mso-bidi-">在树中对应节点的层数</span><span style="font-size: 10.5pt;  mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-fareast- mso-ansi- mso-fareast- mso-bidi-">(</span><span style="font-size: 10.5pt;  mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ascii- mso-hansi- mso-bidi- mso-ansi- mso-fareast- mso-bidi-">深度</span><span style="font-size: 10.5pt;  mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-fareast- mso-ansi- mso-fareast- mso-bidi-">)</span></font></span></p>
<p>它的动态模型与合并石子相当类似</p>
<p>Ｆ［Ｉ，Ｊ］＝ＭＩＮ（　Ｆ［Ｉ，Ｋ－１］+Ｆ［Ｋ+１，Ｊ］+ＳＵＭ［Ｉ，Ｊ］　）</p>
<p>初值Ｆ［Ｉ，Ｉ］＝Ａ［Ｉ］　Ｆ［Ｉ，Ｊ］＝∞（Ｉ＜Ｊ）　Ｆ［Ｉ，Ｊ］＝０　（Ｉ＞Ｊ）</p>
<p>ＳＵＭ［Ｉ，Ｊ］＝Ａ［Ｉ］+Ａ［Ｉ+１］+....+Ａ［Ｊ－１］+Ａ［Ｊ］..</p>
<p>表示中序遍历从Ｉ到Ｊ，以Ｋ为根结点的最优值，可以理解为当你决定将Ｆ［Ｉ，Ｋ－１］，Ｆ［Ｋ+１，Ｊ］两棵子树用Ｋ作根结点连起来时，子树的点都＂多了一层＂，因而花费要加上ＳＵＭ［Ｉ，Ｊ］</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">我们考虑这个问题的一个实例。我们有</span><span><font face="Times New Roman">5</font></span><span style=" mso-ascii- mso-hansi-">个数据项，按字典序排列</span><span><font face="Times New Roman">(A,B,C,D,E)</font></span><span style=" mso-ascii- mso-hansi-">其各自的搜索概率为</span><span><font face="Times New Roman">(0.25,0.05,0.2,0.4,0.1)</font></span><span style=" mso-ascii- mso-hansi-">。这个例子的最优值是</span><span><font face="Times New Roman">f(１,５)=1.9)</font></span><span style=" mso-ascii- mso-hansi-">，其对应的最优二叉搜索树如图</span><span style=" mso-ascii- mso-hansi-">所示。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<div forimg="1">
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/sixstar/pic/item/70146faf006f7be7fbed50f7.jpg"></p>
<p>var a,s:array[0..5] of real;<br>
&nbsp;&nbsp;&nbsp;  i,j,k:longint;<br>
&nbsp;&nbsp;&nbsp;  f:array[0..5,0..5] of real;<br>
begin<br>
  fillchar(f,sizeof(f),$7f);<br>
  s[0]:=0;<br>
  for i:=1 to 5 do<br>
&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;  read(a[i]);<br>
&nbsp;&nbsp;&nbsp;  s[i]:=s[i-1]+a[i];<br>
&nbsp;&nbsp;&nbsp;  f[i,i]:=a[i] ;<br>
&nbsp;&nbsp;&nbsp;  end;<br>
  for i:=0 to 5 do<br>
  for j:=0 to 5 do<br>
  if i&gt;j then<br>
  f[i,j]:=0;<br>
  for i:=5-1 downto 1 do<br>
  for j:=i+1 to 5 do<br>
  for k:=i to j do<br>
  if f[i,k-1]+f[k+1,j]+s[j]-s[i-1]&lt;f[i,j] then<br>
  f[i,j]:= f[i,k-1]+f[k+1,j]+s[j]-s[i-1];</p>
<p>  writeln(f[1,5]:0:1);<br>
end.</p>
<p> </p>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/dp%B9%E9%C4%C9">dp归纳</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/a7ed87fbbf4873254f4aea19.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月12日 星期三  下午 02:47</pubDate>
        <category><![CDATA[dp归纳]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/a7ed87fbbf4873254f4aea19.html</guid>
</item>

<item>
        <title><![CDATA[复杂的按钮(button.pas)]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/9976393397e8f6ff1a4cffae.html]]></link>
        <description><![CDATA[
		
		<h3 style="margin: 13pt 0cm"><font size="5"><span style=" mso-ascii- mso-hansi-">复杂的按钮</span><span><font face="宋体, MS Song">(button.pas)</font></span></font></h3>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">【题目描述】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">小</span><span><font face="宋体, MS Song">k</font></span><span style=" mso-ascii- mso-hansi-">在遗迹探险时遇到了</span><span><font face="宋体, MS Song">n</font></span><span style=" mso-ascii- mso-hansi-">个按钮，刚开始所有按钮都处于开状态，小</span><span><font face="宋体, MS Song">k</font></span><span style=" mso-ascii- mso-hansi-">的经验告诉他把所有按钮都关上会有&ldquo;好事&rdquo;发生，可是有些按钮按下时会让其他一些已经闭合的按钮弹开。经过研究，每个按钮都对应着一个固定的弹开集合，这个按钮按下时，弹开集合中所有的按钮都会变为开状态。现在小</span><span><font face="宋体, MS Song">k</font></span><span style=" mso-ascii- mso-hansi-">想知道是否能让所有的按钮变为闭状态。如果能，打印最少步数以及方案。否则，打&ldquo;</span><span><font face="宋体, MS Song">no solution&quot;</font></span><span style=" mso-ascii- mso-hansi-">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">【输入格式】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt"><span style=" mso-ascii- mso-hansi-">第一行一个整数</span><span><font face="宋体, MS Song">n</font></span><span style=" mso-ascii- mso-hansi-">，表示</span><span><font face="宋体, MS Song">n</font></span><span style=" mso-ascii- mso-hansi-">个按钮</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt"><span style=" mso-ascii- mso-hansi-">接下来</span><span><font face="宋体, MS Song">n</font></span><span style=" mso-ascii- mso-hansi-">行，表示编号为</span><span><font face="宋体, MS Song">l</font></span><span style=" mso-ascii- mso-hansi-">到</span><span><font face="宋体, MS Song">n</font></span><span style=" mso-ascii- mso-hansi-">个按钮</span><font face="宋体, MS Song"> </font><span style=" mso-ascii- mso-hansi-">的弹开集合</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">格式为</span><span><font face="宋体, MS Song">mi</font></span><span style=" mso-ascii- mso-hansi-">，</span><span><font face="宋体, MS Song">B1B2 B3</font></span><span style=" mso-ascii- mso-hansi-">…</span><span><font face="宋体, MS Song">Bmi</font></span><span style=" mso-ascii- mso-hansi-">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">表示编号为</span><span><font face="宋体, MS Song">i</font></span><span style=" mso-ascii- mso-hansi-">的按钮按下，会让编号为</span><span><font face="宋体, MS Song">B1B2 B3</font></span><span style=" mso-ascii- mso-hansi-">…</span><span><font face="宋体, MS Song">Bmi </font></span><span style=" mso-ascii- mso-hansi-">的按钮弹开</span><span><font face="宋体, MS Song">(</font></span><span style=" mso-ascii- mso-hansi-">注：其中不会出现重</span><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">  </font></span></span><span style=" mso-ascii- mso-hansi-">复</span><span><font face="宋体, MS Song">)</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">【输出格式】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">如果无解，输出</span><span><font face="宋体, MS Song">&quot;no solution&quot;</font></span><span style=" mso-ascii- mso-hansi-">．</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">否则，第一行输出最少步数</span><span><font face="宋体, MS Song">ans</font></span><span style=" mso-ascii- mso-hansi-">，第二行输出用空格分开的</span><span><font face="宋体, MS Song">ans</font></span><span style=" mso-ascii- mso-hansi-">个数，表示按顺序按下</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">编号为这些数的按钮就可以解决。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">如果有多种方案，输出字典序最小的方案。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">【样例输入】</span><span><font face="宋体, MS Song">button.in</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>6</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>2<span style="mso-spacerun: yes">  </span>2<span style="mso-spacerun: yes">  </span>3</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>0</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>2<span style="mso-spacerun: yes">  </span>4<span style="mso-spacerun: yes">  </span>5</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>0</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>0</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>0</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">【样例输出】</span><span><font face="宋体, MS Song">button.out</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>6</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>l<span style="mso-spacerun: yes">  </span>2<span style="mso-spacerun: yes">  </span>3<span style="mso-spacerun: yes">  </span>4<span style="mso-spacerun: yes">  </span>5<span style="mso-spacerun: yes">  </span>6</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">【数据范围】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>l</font></span><span style=" mso-ascii- mso-hansi-">≤</span><span><font face="宋体, MS Song">n</font></span><span style=" mso-ascii- mso-hansi-">≤</span><span><font face="宋体, MS Song">30000</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">令</span><span><font face="宋体, MS Song">M=m1+m2+</font></span><span style=" mso-ascii- mso-hansi-">…</span><span><font face="宋体, MS Song">+mn</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>0</font></span><span style=" mso-ascii- mso-hansi-">≤</span><span><font face="宋体, MS Song">M</font></span><span style=" mso-ascii- mso-hansi-">≤</span><span><font face="宋体, MS Song">1000000</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">逆向思考，当按下最后一个按钮时，不能有任何按钮弹起</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">按下倒数第二个按钮时，最多让最后一个按钮弹起</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span><font face="宋体, MS Song">按下倒数第三个按钮时，最多让后两个弹起</font></span></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span><font face="宋体, MS Song">........................</font></span></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span><font face="宋体, MS Song">按下第二个按钮时，不能让第一个弹起</font></span></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span><font face="宋体, MS Song">按下第一个按钮时，可以让任何按钮弹起</font></span></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span><font face="宋体, MS Song">明显必须按下Ｎ次按钮，且弹起的按钮必须在它之后按下</font></span></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span><font face="宋体, MS Song">可以用拓扑排序生成序列</font></span></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span><font face="宋体, MS Song">用堆优化，每次堆中的元素保证入度都为０，且堆首的元素编号最小</font></span></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span><font face="宋体, MS Song">program fdfd;<br>
var n,i,j,k,x,y:longint;<br>
&nbsp;&nbsp;&nbsp;  b:array[1..30000,0..90] of longint;<br>
&nbsp;&nbsp;&nbsp;  ru,ans:array[1..30000] of longint;<br>
&nbsp;&nbsp;&nbsp;  vis:array[1..30000] of boolean;</font></span></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  h:array[0..30000] of longint;<br>
&nbsp;&nbsp;&nbsp;  size:longint;<br>
  procedure sdown;<br>
  var y,z,v:longint;<br>
  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;  y:=1; z:=y*2; v:=h[1];<br>
&nbsp;&nbsp;&nbsp;&nbsp;  while (z&lt;=size) do<br>
&nbsp;&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if z&lt;size then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if h[z+1]&lt; h[z] then z:=z+1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if h[z]&gt;v then break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  h[y]:=h[z]; y:=z; z:=y*2;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  end;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  h[y]:=v;<br>
  end;<br>
  procedure sink(p:longint);<br>
  var y,z,v:longint;<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  y:=p; z:=y div 2;  v:=h[y] ;<br>
&nbsp;&nbsp;&nbsp;  while (h[z]&gt;v)and(z&gt;=1) do<br>
&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  h[y]:=h[z];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  y:=z; z:=y div 2;<br>
&nbsp;&nbsp;&nbsp;  end;<br>
&nbsp;&nbsp;&nbsp;  h[y]:=v;<br>
  end;<br>
begin<br>
  assign(input,'button.in');assign(output,'button.out');<br>
  reset(input); rewrite(output);<br>
  fillchar(b,sizeof(b),0);<br>
  fillchar(ru,sizeof(ru),0);<br>
  readln(n);<br>
  for i:=1 to n do<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  read(x);<br>
&nbsp;&nbsp;&nbsp;  for j:=1 to x do<br>
&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  read(y);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc(b[i,0]) ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  b[i,b[i,0]] :=y;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc(ru[y]);<br>
&nbsp;&nbsp;&nbsp;  end;<br>
&nbsp;&nbsp;&nbsp;  readln;<br>
  end;<br>
  size:=0;<br>
  for i:=1 to n do<br>
  if ru[i]=0 then<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  inc(size);<br>
&nbsp;&nbsp;&nbsp;  h[size]:=i;<br>
  end;<br>
  fillchar(vis,sizeof(vis),false);<br>
  for i:=1 to n do<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  k:=h[1];<br>
&nbsp;&nbsp;&nbsp;  if vis[k] then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  writeln('no solution');<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  halt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  end;<br>
&nbsp;&nbsp;&nbsp;  vis[k]:=true;<br>
&nbsp;&nbsp;&nbsp;  ans[i]:=k;<br>
&nbsp;&nbsp;&nbsp;  h[1]:=h[size]; dec(size); sdown;<br>
&nbsp;&nbsp;&nbsp;  for j:=1 to b[k,0] do<br>
&nbsp;&nbsp;&nbsp;  if vis[b[k,j]] then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  writeln('no solution');<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  halt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  end<br>
&nbsp;&nbsp;&nbsp;  else<br>
&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;  dec(ru[b[k,j]]);<br>
&nbsp;&nbsp;&nbsp;  if ru[b[k,j]] =0 then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc(size) ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  h[size]:=b[k,j];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sink(size);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  end;<br>
&nbsp;&nbsp;&nbsp;  end;<br>
  end;<br>
  writeln(n);<br>
  for i:=1 to n-1 do write(ans[i], ' ') ;<br>
  writeln(ans[n]);<br>
  close(input);<br>
  close(output);<br>
end．</font></span></font></span></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/%CC%E2%BD%E2">题解</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/9976393397e8f6ff1a4cffae.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月12日 星期三  上午 07:20</pubDate>
        <category><![CDATA[题解]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/9976393397e8f6ff1a4cffae.html</guid>
</item>

<item>
        <title><![CDATA[DP归纳（改写自OIBH）最优字母基码树问题(ARC)（石子合并类）]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/1507a5ef2442bbe8ce1b3ec6.html]]></link>
        <description><![CDATA[
		
		<p>与贪心的合并果子不同，合并石子类问题只能将相邻两堆合并，因而贪心往往得不到最优解</p>
<p>动规模型：</p>
<p>F[I,J]=MIN( F[I,K] + F[K+1,J] + VALUE[I,J] )</p>
<p>初值F[I,J]=∞ F[I,I]=0</p>
<p>或是</p>
<p>F[I,J]=MAX( F[I,K] + F[K+1,J]+VALUE[I,J] )</p>
<p>F[I,J]=0</p>
<p>I&lt;=K&lt;J,而VALUE是本次合并从I到J一段的值，它与之前是如何合并是无关的，且不一定是从I到J的累加（如能量项链）</p>
<p>循环时应从长度小的开始，比如</p>
<p>for i:=n-1 downto 1 do</p>
<p>for j:=i+1 to n do</p>
<p>for k:=i to j-1 do</p>
<p>f[i,j]=........</p>
<p> </p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/dp%B9%E9%C4%C9">dp归纳</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/1507a5ef2442bbe8ce1b3ec6.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月11日 星期二  下午 04:25</pubDate>
        <category><![CDATA[dp归纳]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/1507a5ef2442bbe8ce1b3ec6.html</guid>
</item>

<item>
        <title><![CDATA[DP归纳（改写自OIBH）全点对最短路径问题（APSP）]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/344a25387a3be7f5b211c7f2.html]]></link>
        <description><![CDATA[
		
		<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic">全点对最短路径问题<span>(</span></span><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic">All-Pairs Shortest Paths</span><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic">)，即寻找从任意点p到任意其他点q的最短路径，与单源最短路径不同，它计算的是集合中任意两个点对的最短路径，所以复杂度是N^3的</span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic">方程模型</span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic">F[I,J]=MIN( F[I,K]+F[K,J],F[I,J] ),初值F[I,J]=<span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic">∞,F[I,J]=G[I,J](如果I,J两点读入时有直连的话)</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic"><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic">I&lt;&gt;J&lt;&gt;K</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic"><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic">注意K应放在最外重循环</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic"><span style="font-size: 10.5pt;  mso-bidi- mso-ansi- mso-fareast- mso-bidi- mso-bidi-font-style: italic">如果F[I,J]用布尔型的话可以判断两者是否连通</span></span></font></font></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/dp%B9%E9%C4%C9">dp归纳</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/344a25387a3be7f5b211c7f2.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月11日 星期二  下午 04:02</pubDate>
        <category><![CDATA[dp归纳]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/344a25387a3be7f5b211c7f2.html</guid>
</item>

<item>
        <title><![CDATA[DP归纳（改写自OIBH）最佳分配问题（ALLOT）]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/7030fafcd6679685b901a0eb.html]]></link>
        <description><![CDATA[
		
		<p><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-: 1.0pt">最佳分配问题是指决定如何把有限的资源分配一些用户，这里给每个用户分配一定量的资源都会有相应的利润或花费，最终的分配方式使花费总和达到最大或最小</span></p>
<p><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-: 1.0pt">这种类型的重要特征是分配价值与顺序无关</span></p>
<p><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-: 1.0pt">其方程模型一般是：</span></p>
<p><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-: 1.0pt">F[I,J]=MIN( F[ I-1, J-P[I] ]+W[I] )初值F[I,J]=<span style="font-size: 10.5pt; mso-bidi-: italic">∞,F[0,0]=0</span></span></p>
<p><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-: 1.0pt"><span style="font-size: 10.5pt; mso-bidi-: italic">F[I,J]=MAX( F[ I-1, J-P[I] ]+W[I] )初值F[I,J]=0</span></span></p>
<p><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-: 1.0pt"><span style="font-size: 10.5pt; mso-bidi-: italic">为防止越界J-P[I]应当&gt;=0,P[I]为分配的花费，W[I]为分配所得的利益</span></span></p>
<p>而其最优值只与上一个有关，通常可在空间上优化降低维度</p>
<p>for i:=1 to n do</p>
<p>for j:=m downto 1 do</p>
<p>if j-p[i]&gt;=0 then</p>
<p>if .........</p>
<p>f[j]:=f[j-p[i]]+w[i]</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/dp%B9%E9%C4%C9">dp归纳</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/7030fafcd6679685b901a0eb.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月11日 星期二  下午 03:48</pubDate>
        <category><![CDATA[dp归纳]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/7030fafcd6679685b901a0eb.html</guid>
</item>

<item>
        <title><![CDATA[传送机(sent.pas/e/cpp)]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/faec643ddfc745e93d6d970b.html]]></link>
        <description><![CDATA[
		
		<h3 style="margin: 13pt 0cm"><font size="5"><span style=" mso-ascii- mso-hansi-">传送机</span><span><font face="宋体, MS Song">(sent.pas/e/cpp)</font></span></font></h3>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【问题描述】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style=" mso-ascii- mso-hansi-">刷完牙洗完脸，黄黄同学就要上课去了。可是黄黄同学每次去上课时总喜欢把校园里面的每条路都走一遍，当然，黄黄同学想每条路也只走一遍。我们一般人很可能对一些地图是办不到每条路走一遍且仅走一遍的，但是黄黄同学有个传送机，他可以任意地将一个、人从一个路口传送到任意一个路口。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style=" mso-ascii- mso-hansi-">可是，每传送一次是需要耗费巨大的内力的，黄黄同学希望可以用最少的传送次数完成游遍校园，你能帮助他吗</span><span><font face="宋体, MS Song">?</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style=" mso-ascii- mso-hansi-">因为黄黄同学只是游历校园，于是我们可以认为黄黄同学可以从任意点开始，到任意点结束。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【输入文件】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style=" mso-ascii- mso-hansi-">输入文件</span><span><font face="宋体, MS Song">sent.in</font></span><span style=" mso-ascii- mso-hansi-">的第一行有一个整数</span><span><font face="宋体, MS Song">N</font></span><span style=" mso-ascii- mso-hansi-">，表示黄黄的校园里一共有多少路口。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes"> </span><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;  </span></font></span><span style=" mso-ascii- mso-hansi-">第二行有一个整数</span><span><font face="宋体, MS Song">M</font></span><span style=" mso-ascii- mso-hansi-">，表示路口之间有</span><span><font face="宋体, MS Song">M</font></span><span style=" mso-ascii- mso-hansi-">条路。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style=" mso-ascii- mso-hansi-">后面</span><span><font face="宋体, MS Song">M</font></span><span style=" mso-ascii- mso-hansi-">行每行两个整数</span><span><font face="宋体, MS Song">a</font></span><span style=" mso-ascii- mso-hansi-">、</span><span><font face="宋体, MS Song">b</font></span><span style=" mso-ascii- mso-hansi-">表示</span><span><font face="宋体, MS Song">a</font></span><span style=" mso-ascii- mso-hansi-">与</span><span><font face="宋体, MS Song">b</font></span><span style=" mso-ascii- mso-hansi-">之间有一条路，且路是双向的。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【输出文件】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">输出文件</span><span><font face="宋体, MS Song">sent.out</font></span><span style=" mso-ascii- mso-hansi-">只包括一个整数</span><span><font face="宋体, MS Song">s</font></span><span style=" mso-ascii- mso-hansi-">，表示黄黄同学最少的传送次数。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【样例输入】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>3</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>2</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>1<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;  </span>2</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>2<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;  </span>3</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【样例输出】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>0</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【数据范围】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">对于</span><span><font face="宋体, MS Song">100</font></span><span style=" mso-ascii- mso-hansi-">％的数据，保证</span><span><font face="宋体, MS Song">N</font></span><span style=" mso-ascii- mso-hansi-">≤</span><span><font face="宋体, MS Song">100000</font></span><span style=" mso-ascii- mso-hansi-">，</span><span><font face="宋体, MS Song">K</font></span><span style=" mso-ascii- mso-hansi-">≤</span><span><font face="宋体, MS Song">500000</font></span><span style=" mso-ascii- mso-hansi-">，</span><span><font face="宋体, MS Song">1</font></span><span style=" mso-ascii- mso-hansi-">≤</span><span><font face="宋体, MS Song">a</font></span><span style=" mso-ascii- mso-hansi-">，</span><span><font face="宋体, MS Song">b</font></span><span style=" mso-ascii- mso-hansi-">≤</span><span><font face="宋体, MS Song">N</font></span><span style=" mso-ascii- mso-hansi-">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【时限】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>ls</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">题目的实质就是求最少添加几条边，使图能一笔画（欧拉路）</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">一个图能一笔画且最后回到起点的要求是奇点个数为０</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">而仅仅是一笔画，起讫点不同的要求是奇点个数为２</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">奇点个数一定是偶数</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">原先只统计奇点个数，没有考虑连通块的问题，做题还是不太认真，考虑没有全面</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">＂正规＂的做法是用链表存储，用ＢＦＳ统计连通块</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">program Jackchen;<br>
type tree=^node;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  node=record<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  val:longint;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  link:tree;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  end;<br>
var n,m,i,j,x,y,t,v,s,cv:longint;<br>
&nbsp;&nbsp;&nbsp;  c:array[1..100000] of tree;<br>
&nbsp;&nbsp;&nbsp;  team,num:array[1..100000] of longint;<br>
&nbsp;&nbsp;&nbsp;  vis:array[1..100000] of boolean;<br>
&nbsp;&nbsp;&nbsp;  h,d:longint;<br>
&nbsp;&nbsp;&nbsp;  ttree:tree;<br>
&nbsp;&nbsp;&nbsp;  tot1,tot,ans:longint;<br>
  procedure insert(a,b:longint);<br>
  var ttree:tree;<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  new(ttree);<br>
&nbsp;&nbsp;&nbsp;  ttree^.val:=b;<br>
&nbsp;&nbsp;&nbsp;  ttree^.link:=c[a];<br>
&nbsp;&nbsp;&nbsp;  c[a]:=ttree;<br>
  end;<br>
begin<br>
  assign(input,'sent.in');assign(output,'sent.out') ;<br>
  reset(input); rewrite(output);<br>
  fillchar(num,sizeof(num),0) ;<br>
  readln(n); readln(m);<br>
  for i:=1 to m do<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  readln(x,y);<br>
&nbsp;&nbsp;&nbsp;  if x=y then continue;<br>
&nbsp;&nbsp;&nbsp;  insert(x,y);<br>
&nbsp;&nbsp;&nbsp;  insert(y,x);<br>
&nbsp;&nbsp;&nbsp;  inc(num[x]) ; inc(num[y]);<br>
  end;<br>
  fillchar(vis,sizeof(vis),true);<br>
  ans:=0; tot1:=0;<br>
  for i:=1 to n do<br>
  if vis[i] then<br>
  begin<br>
  h:=0; d:=1;<br>
  team[1]:=i; vis[i]:=false;  tot:=0;<br>
  if odd(num[i]) then inc(tot);<br>
  repeat<br>
&nbsp;&nbsp;&nbsp;  inc(h); v:=team[h];  ttree:=c[v];<br>
&nbsp;&nbsp;&nbsp;  while ttree&lt;&gt;nil do<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cv:=ttree^.val;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if vis[cv] then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  vis[cv]:=false;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc(d);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  team[d]:=cv;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if odd(num[cv]) then inc(tot);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  end;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ttree:=ttree^.link;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  end;<br>
  until h&gt;=d;<br>
  if d&lt;=1 then continue;<br>
  inc(tot1);<br>
  if tot&gt;2 then ans:=ans+(tot-2)div 2;<br>
  end;<br>
  ans:=ans+tot1-1;<br>
  writeln(ans);<br>
  close(input); close(output);<br>
end.<br>
结果老师的评测能过，机房的celeron 1.7G超了</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">感谢林宇鹏大牛提供的并查集思路，原先我还担心递归会堆栈溢出（Ｎ＝１０００００），结果给出的数据全部能秒过</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">program fdfdf;<br>
var n,i,j,m,x,y,f1,f2,tot1,ans:longint;<br>
&nbsp;&nbsp;&nbsp;  f,num,oddn,c:array[1..100000] of longint;</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">  function dfs(v:longint):longint;<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  if v&lt;&gt;f[v] then f[v]:=dfs(f[v]);<br>
&nbsp;&nbsp;&nbsp;  dfs:=f[v];<br>
  end;</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">begin<br>
assign(input,'sent.in');assign(output,'sent.out');<br>
reset(input); rewrite(output);<br>
readln(n);<br>
readln(m);<br>
fillchar(c,sizeof(c),0);<br>
for i:=1 to n do f[i]:=i;<br>
for i:=1 to m do<br>
begin<br>
  readln(x,y);<br>
  if x=y then continue;<br>
  f1:=dfs(x);  f2:=dfs(y);<br>
  if f1&lt;&gt;f2 then<br>
  f[f1]:=y;<br>
  inc(c[x]); inc(c[y]);<br>
end;<br>
fillchar(num,sizeof(num),0) ;<br>
fillchar(oddn,sizeof(oddn),0);<br>
for i:=1 to n do<br>
begin<br>
  f1:=dfs(i);<br>
  inc(num[f1]);<br>
  if odd(c[i]) then inc(oddn[f1]);<br>
end;<br>
tot1:=0; ans:=0;<br>
for i:=1 to n do<br>
if num[i] &gt;1 then<br>
begin<br>
  if oddn[i]&gt;2 then<br>
  ans:=ans+(oddn[i]-2) div 2;<br>
  inc(tot1);<br>
end;<br>
writeln(ans+tot1-1);</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">close(input); close(output);<br>
end.<br>
</font></span></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/%CC%E2%BD%E2">题解</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/faec643ddfc745e93d6d970b.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月11日 星期二  下午 02:49</pubDate>
        <category><![CDATA[题解]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/faec643ddfc745e93d6d970b.html</guid>
</item>

<item>
        <title><![CDATA[放牙刷 (put.pas/c/cpp)(错位排序)（错位排列）]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/abf8086da9bcaefc43169402.html]]></link>
        <description><![CDATA[
		
		<h3 style="margin: 13pt 0cm"><font size="5"><span style=" mso-ascii- mso-hansi-">放牙刷</span><span><font face="宋体, MS Song"> (put.pas/c/cpp)</font></span></font></h3>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【问题描述】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">众所周知，黄黄同学早晨起来是要刷牙的。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">黄黄同学有</span><span><font face="宋体, MS Song">N</font></span><span style=" mso-ascii- mso-hansi-">支牙刷，又有</span><span><font face="宋体, MS Song">N</font></span><span style=" mso-ascii- mso-hansi-">个牙刷套</span><span><font face="宋体, MS Song">,</font></span><span style=" mso-ascii- mso-hansi-">开始的时候，一支牙刷对应放在一个牙刷套中。可是有一天，黄黄同学把所有牙刷套里的牙刷都拿出来，玩了一会儿，他又要把所有的牙刷都放回去。可是，他忽然一想，我可不可以使得没有任何一支牙刷放回它原来的牙刷套里面呢</span><span><font face="宋体, MS Song">?</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">黄黄同学努力试了很久，却一直没有成功过一次。于是他断定这个要求是无法达成的，你怎么认为的呢</span><span><font face="宋体, MS Song">?</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【输入文件】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">输入文件</span><span><font face="宋体, MS Song">put.in</font></span><span style=" mso-ascii- mso-hansi-">只包括一个整数</span><span><font face="宋体, MS Song">N</font></span><span style=" mso-ascii- mso-hansi-">，表示牙刷和牙刷套的总数。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【输出文件】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">输出文件</span><span><font face="宋体, MS Song">put.out</font></span><span style=" mso-ascii- mso-hansi-">，如果存在满足要求的方法，输出放法方案总数</span><span><font face="宋体, MS Song">L</font></span><span style=" mso-ascii- mso-hansi-">。因为方案总数可能比较大，所以你可以将答案</span><span><font face="宋体, MS Song">Mod 1206</font></span><span style=" mso-ascii- mso-hansi-">后再输出。如果不存在满足要求的方法，则输出</span><span><font face="宋体, MS Song">&quot;No Solution!&rdquo;</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【样例输入】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>3</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【样例输出】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>2</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style=" mso-ascii- mso-hansi-">【数据范围】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">对于</span><span><font face="宋体, MS Song">40</font></span><span style=" mso-ascii- mso-hansi-">％的数据，保证</span><span><font face="宋体, MS Song">N</font></span><span style=" mso-ascii- mso-hansi-">≤</span><span><font face="宋体, MS Song">9</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">对于</span><span><font face="宋体, MS Song">100</font></span><span style=" mso-ascii- mso-hansi-">％的数据，保证</span><span><font face="宋体, MS Song">N</font></span><span style=" mso-ascii- mso-hansi-">≤</span><span><font face="宋体, MS Song">100000</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span style="mso-spacerun: yes"><font face="宋体, MS Song">&nbsp;&nbsp;&nbsp;  </font></span></span><span style=" mso-ascii- mso-hansi-">【时限】</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;  </span>ls</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">很容易看出它就是错位排列，用通项公式明显不适用，应使用递推式</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">Ｆ［Ｉ］＝（Ｉ-１）*（Ｆ［Ｉ－１］+Ｆ［Ｉ－２］）</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">证明：*　　*　*　　*　*　　*....</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">　　　１　２　３　４　５　６....</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">假设现在Ｉ＝６，第６位上有５种选择（Ｉ－１），比如在第６位上放的是３，如果第３位上又被６占据，那么剩下的４位自行错位排列有Ｆ［４］种方案（Ｆ［Ｉ－２］），可以把这种情况视为３＼６原先各在其位，其余４位错位，而后３/６互换</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">如果如果没有出现３＼６相互占据的情况，说明３不在第３位上，３＼６互换前，前５位已错位排序讫，那么就有Ｆ［５］种情况，互换后依然满足错位，方案数也是Ｆ［Ｉ－１］</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">所以Ｆ［Ｉ］＝（Ｉ－１）*（Ｆ［Ｉ－１］+Ｆ［Ｉ-２］）</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">边界Ｆ［２］＝１　Ｆ［３］＝２</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">Ｎ＝０或Ｎ＝１无解</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="宋体, MS Song">program fgdfdfd;<br>
var n,i,j:longint;<br>
&nbsp;&nbsp;&nbsp;  f:array[1..100000]of longint;<br>
begin<br>
  assign(input,'put.in');assign(output,'put.out') ;<br>
  reset(input); rewrite(output);<br>
  fillchar(f,sizeof(f),0);<br>
  f[2]:=1 ; f[3]:=2;<br>
  readln(n);<br>
  if n in [0..1] then writeln('No Solution!')<br>
  else<br>
  begin<br>
  for i:=4 to n do<br>
  f[i]:=((i-1)*(f[i-1] +f[i-2] )) mod 1206;<br>
  writeln(f[n]) ;<br>
  end;<br>
  close(input); close(output);<br>
end.<br>
</font></span></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/%CC%E2%BD%E2">题解</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/abf8086da9bcaefc43169402.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月11日 星期二  下午 02:31</pubDate>
        <category><![CDATA[题解]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/abf8086da9bcaefc43169402.html</guid>
</item>

<item>
        <title><![CDATA[关路灯(N=1000动规版)]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/89e23fd18fd0e9d4572c844c.html]]></link>
        <description><![CDATA[
		
		<table cellspacing="0" cellpadding="0" bgcolor="#ffffff" border="0">
    <tbody>
        <tr>
            <td valign="top" align="left" width="10"> </td>
            <td valign="top" align="left" width="502">【问题描述】<br>
            　　多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。<br>
            　　多瑞卡每晚到早晨5点钟都在晚会上，然后他开始关灯。开始时，他站在某一盏路灯的旁边。<br>
            　　每盏灯都有一个给定功率的电灯泡，因为多端卡有着自觉的节能意识，他希望在耗能总数最少的情况下将所有的灯关掉。<br>
            　　多端卡因为太累了，所以只能以1m/s的速度行走。关灯不需要花费额外的时间，因为当他通过时就能将灯关掉。<br>
            　　编写程序，计算在给定路灯设置，灯泡功率以及多端卡的起始位置的情况下关掉所有的灯需耗费的最小能量。<br>
            【输入格式】<br>
            　　输入文件的第一行包含一个整数N，2≤N≤1000，表示该村庄路灯的数量。<br>
            　　第二行包含一个整数V，1≤V≤N，表示多瑞卡开始关灯的路灯号码。<br>
            　　接下来的N行中，每行包含两个用空格隔开的整数D和W，用来描述每盏灯的参数，其中0≤D≤1000，0≤W≤1000。D表示该路灯与村庄开始处的距离(用米为单位来表示)，W表示灯泡的功率，即在每秒种该灯泡所消耗的能量数。路灯是按顺序给定的。<br>
            【输出格式】<br>
            　　输出文件的第一行即唯一的一行应包含一个整数，即消耗能量之和的最小值。注意结果小超过1,000,000,000。<br>
            【输入样例】<br>
             4<br>
             3<br>
             2 2<br>
             5 8<br>
             6 1<br>
             8 7<br>
            【输出样例】<br>
             56</td>
        </tr>
        <tr>
            <td width="14" background="Skin/Life Azure/Frame_r3_c1.gif" height="14"> </td>
            <td background="Skin/Life Azure/Frame_r3_c2.gif" colspan="2">program fdfd;<br>
            var n,v,i,j,a,b,min,c:longint;<br>
            &nbsp;&nbsp;&nbsp;  d,w,sw:array[0..1000] of longint;<br>
            &nbsp;&nbsp;&nbsp;  f,val:array[0..1000,0..1000] of longint;<br>
            begin<br>
              assign(input,'power.in');assign(output,'power.out');<br>
              reset(input); rewrite(output);<br>
              readln(n);<br>
              readln(v);<br>
              sw[0]:=0;<br>
              for i:=1 to n do<br>
              begin<br>
              readln(d[i],w[i]);<br>
              sw[i]:=sw[i-1]+w[i];<br>
              end;<br>
              fillchar(val,sizeof(val),0) ;<br>
              for i:=1 to n do<br>
              for j:=i to n do<br>
              val[i,j]:=val[i,j-1]+w[j];<br>
              for i:=1 to n do<br>
              for j:=i to n do<br>
              val[j,i]:=val[i,j];<br>
              fillchar(f,sizeof(f),$7f);<br>
              f[0,v]:=0;<br>
              for i:=1 to n-1 do<br>
              for j:=1 to n do<br>
              if j&lt;&gt;v then<br>
              begin<br>
            &nbsp;&nbsp;  if j&lt;v then begin  a:=j+1; b:=i+j; end;<br>
            &nbsp;&nbsp;  if j&gt;v then begin  a:=j-1; b:=j-i; end;<br>
            &nbsp;&nbsp;  c:=maxlongint;<br>
            &nbsp;&nbsp;  if (a&lt;=n)and(a&gt;=1) then<br>
            &nbsp;&nbsp;  if f[i-1,a]&lt;1000000000 then<br>
            &nbsp;&nbsp;  c:=f[i-1,a]+(sw[n]-val[j,b]+w[j])*abs(d[a]-d[j]);<br>
            &nbsp;&nbsp;  if (b&lt;=n)and(b&gt;=1) then<br>
            &nbsp;&nbsp;  if f[i-1,b]&lt;1000000000 then<br>
            &nbsp;&nbsp;  if f[i-1,b]+(sw[n]-val[j,b]+w[j])*abs(d[b]-d[j])&lt;c then<br>
            &nbsp;&nbsp;  c:=f[i-1,b]+(sw[n]-val[j,b]+w[j])*abs(d[b]-d[j]);<br>
            &nbsp;&nbsp;  if c&lt;=1000000000then<br>
            &nbsp;&nbsp;  if c&lt;f[i,j] then<br>
            &nbsp;&nbsp;  f[i,j]:=c;<br>
              end;<br>
              min:=maxlongint;<br>
              for i:=1 to n do<br>
              if f[n-1,i]&lt;min then<br>
              min:=f[n-1,i] ;<br>
              writeln(min);<br>
              close(input); close(output);<br>
            end.</td>
            <td width="14" background="Skin/Life Azure/Frame_r3_c3.gif" height="14"> </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" bgcolor="#ffffff" border="0">
    <tbody>
        <tr>
            <td width="14" background="Skin/Life Azure/Frame_r1_c1.gif" height="14"> </td>
            <td background="Skin/Life Azure/Frame_r1_c2.gif" colspan="2"> </td>
            <td width="14" background="Skin/Life Azure/Frame_r1_c3.gif" height="14"> </td>
        </tr>
    </tbody>
</table> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/%CC%E2%BD%E2">题解</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/89e23fd18fd0e9d4572c844c.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月10日 星期一  下午 08:46</pubDate>
        <category><![CDATA[题解]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/89e23fd18fd0e9d4572c844c.html</guid>
</item>

<item>
        <title><![CDATA[网络]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/cb17143fff9f61eb54e723cb.html]]></link>
        <description><![CDATA[
		
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan" align="center"><span style="font-size: 22pt; color: red; ">网络<span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left"><span style="color: black;  mso-hansi-"> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left; mso-pagination: widow-orphan; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt" align="left"><span style="color: black;  mso-hansi- mso-ascii-">一些学校连接在一个计算机网络上。学校之间存在软件支援协议。每个学校都有它应支援的学校名单（学校</span><span style="color: black;  mso-hansi-">a</span><span style="color: black;  mso-hansi- mso-ascii-">支援学校ｂ，并不表示学校ｂ一定支援学校</span><span style="color: black;  mso-hansi-">a</span><span style="color: black;  mso-hansi- mso-ascii-">）。当某校获得一个新软件时，无论是直接得到还是网络得到，该校都应立即将这个软件通过网络传送给它应支援的学校。因此，一个新软件若想让所有连接在网络上的学校都能使用，只需将其提供给一些学校即可。</span><span style="color: black;  mso-hansi-"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24.1pt; text-align: left; mso-pagination: widow-orphan; mso-char-indent-count: 2.0; mso-char-indent-size: 12.05pt" align="left"><strong><span style="display: none; font-size: 12pt; color: black;  mso-font-kerning: 0pt; mso-hansi- mso-hide: all"> </span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong><span style="color: black;  mso-hansi- mso-ascii-">子任务</span></strong><strong><span style="color: black;  mso-hansi-">a</span></strong><strong><span style="color: black;  mso-hansi- mso-ascii-">：</span></strong><span style="display: none; color: black;  mso-hansi- mso-hide: all"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt"><span style="color: black;  mso-hansi- mso-ascii-">请编一个程序，根据学校间支援协议（各个学校的支援名单），计算最少需要将一个新软件直接提供给多少个学校，才能使软件通过网络被传送到所有学校。</span><span style="color: black;  mso-hansi-"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.1pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.55pt"><strong><span style="display: none; color: black;  mso-hansi- mso-hide: all"> </span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong><span style="color: black;  mso-hansi- mso-ascii-">子任务ｂ：</span></strong><span style="display: none; color: black;  mso-hansi- mso-hide: all"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt"><span style="color: black;  mso-hansi- mso-ascii-">如果允许在原有支援协议上添加新的支援关系。则总可以形成一个新的协议，使得此时只需将一个新软件提供给任何一个学校，其他所有学校就都可以通过网络获得该软件。编程计算最少需要添加几条新的支援关系。</span><span style="color: black;  mso-hansi-"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left"><strong><span style="color: black;  mso-bidi-font-size: 14.0pt"> </span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left"><strong><span style="color: black;  mso-bidi-font-size: 14.0pt">输入数据：<span></span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left"><span style="display: none; color: black;  mso-bidi-font-size: 14.0pt; mso-font-kerning: 0pt; mso-hide: all"> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt"><span style="color: black;  mso-bidi-font-size: 14.0pt">第一行是一个正整数ｎ（２≤ｎ≤１００），表示与网络连接的学校总数，随后ｎ行分别表示每个学校要支援的学校，即：<span>i+1行表示第i号学校要支援的所有学校代号，最后０结束。如果一个学校不支援任何其他学校，相应行则会有一个０。一行中若有多个数字，数字之间以一个空格分隔。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.1pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.55pt"><strong><span style="display: none; color: black;  mso-bidi-font-size: 14.0pt; mso-hide: all"> </span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong><span style="color: black;  mso-bidi-font-size: 14.0pt">输出数据：<span></span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="display: none; color: black;  mso-bidi-font-size: 14.0pt; mso-hide: all"> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt"><span style="color: black;  mso-bidi-font-size: 14.0pt">包含两行，第一行是一个正整数，表示子任务<span>a的解，第二行也是一个正整数，表示子任务ｂ的解。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="color: black;  mso-bidi-font-size: 14.0pt"> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong><span style=" mso-hansi- mso-ascii-">【输入样例】</span></strong><span style="color: black;  mso-bidi-font-size: 14.0pt">network.in</span><strong><span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">5</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">2 4 3 0</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">4 5 0</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">0</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">0</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">1 0</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"> </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong><span style=" mso-hansi- mso-ascii-">【输出样例】</span></strong><span style="color: black;  mso-bidi-font-size: 14.0pt">network.out</span><strong><span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">1</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">2</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">先将强连通分量收缩成点,对于第一问,统计入度为0的点即可,第二问,分别统计入度为0的个数与出度为0的个数,取最大值即可,因为要使图全连通,入度为0的必须有入度,出度为0的必须有出度,才能使任意一个点到达其他任何点(除了全图只有1个点的特殊情况)</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">将强连通分量收缩成点使用两遍深搜的Kosaraju算法.</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">对于一个图中的连通分量来说,它的逆图中这个连通分量依然存在,第二次DFS时依然要按上次的顺序</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">收缩时需重新构图</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">program fdfdf;<br>
var n,i,j,x,l:longint;<br>
&nbsp;&nbsp;&nbsp;  a,g,a1:array[1..100,0..100]  of longint;<br>
&nbsp;&nbsp;&nbsp;  b,t:array[1..100] of longint;<br>
&nbsp;&nbsp;&nbsp;  ans1,ans2,d1,d2:longint;</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">  procedure dfs(v:longint);<br>
  var i1:longint;<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  b[v]:=1;<br>
&nbsp;&nbsp;&nbsp;  for i1:=1 to a[v,0] do<br>
&nbsp;&nbsp;&nbsp;  if b[a[v,i1]]=0 then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  dfs(a[v,i1]);<br>
&nbsp;&nbsp;&nbsp;  inc(l);<br>
&nbsp;&nbsp;&nbsp;  t[l]:=v;<br>
  end;</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">  procedure dfs1(v:longint);<br>
  var i1:longint;<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  b[v]:=l;<br>
&nbsp;&nbsp;&nbsp;  for i1:=1 to a1[v,0] do<br>
&nbsp;&nbsp;&nbsp;  if b[a1[v,i1]]=0 then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  dfs1(a1[v,i1]);<br>
  end;</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">begin<br>
  assign(input,'network.in');assign(output,'network.out');<br>
  reset(input); rewrite(output);<br>
  readln(n);<br>
  fillchar(a,sizeof(a),0);<br>
  fillchar(g,sizeof(g),0);<br>
  for i:=1 to n do<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  read(x);<br>
&nbsp;&nbsp;&nbsp;  while x&lt;&gt;0 do<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc(a[i,0]);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  a[i,a[i,0]]:=x;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc(a1[x,0]);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  a1[x,a1[x,0]]:=i;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  read(x);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  end;<br>
&nbsp;&nbsp;&nbsp;  readln;<br>
  end;<br>
  fillchar(b,sizeof(b),0); l:=0;<br>
  for i:=1 to n do<br>
  if b[i]=0 then<br>
&nbsp;&nbsp;&nbsp;  dfs(i);<br>
  fillchar(b,sizeof(b),0); l:=0;<br>
  for i:=n downto 1 do<br>
  if b[t[i]]=0 then<br>
&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;  inc(l);<br>
&nbsp;&nbsp;&nbsp;  dfs1(t[i]);<br>
&nbsp;&nbsp;&nbsp;  end;<br>
  for i:=1 to n do<br>
  for j:=1 to a[i,0] do<br>
  g[ b[i] , b[a[i,j]] ]:=1;</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">  ans1:=0;<br>
  for i:=1 to l do<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  d1:=0;<br>
&nbsp;&nbsp;&nbsp;  for j:=1 to l do<br>
&nbsp;&nbsp;&nbsp;  if i&lt;&gt;J then<br>
&nbsp;&nbsp;&nbsp;  if g[j,i]=1 then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  d1:=1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  end;<br>
&nbsp;&nbsp;&nbsp;  if d1=0 then inc(ans1);<br>
  end;<br>
  writeln(ans1);<br>
  ans2:=0; d2:=0;<br>
  for i:=1 to l do<br>
&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  d1:=0;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for j:=1 to l do<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if i&lt;&gt;j then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if g[i,j] =1 then begin d1:=1; break;  end;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if d1=0 then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc(d2);<br>
&nbsp;&nbsp;&nbsp;  end;<br>
  ans2:=d2; d2:=0;<br>
  for i:=1 to l do<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  d1:=0;<br>
&nbsp;&nbsp;&nbsp;  for j:=1 to l do<br>
&nbsp;&nbsp;&nbsp;  if i&lt;&gt;j then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if g[j,i] =1 then begin d1:=1; break; end;<br>
&nbsp;&nbsp;&nbsp;  if d1=0 then<br>
&nbsp;&nbsp;&nbsp;  inc(d2);<br>
  end;<br>
  if d2&gt;ans2 then ans2:=d2;<br>
  if l=1 then writeln(0)<br>
  else writeln(ans2);<br>
  close(input); close(output);<br>
end.</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/%CC%E2%BD%E2">题解</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/cb17143fff9f61eb54e723cb.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月10日 星期一  下午 04:58</pubDate>
        <category><![CDATA[题解]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/cb17143fff9f61eb54e723cb.html</guid>
</item>

<item>
        <title><![CDATA[多米诺游戏]]></title>
        <link><![CDATA[http://hi.baidu.com/sixstar/blog/item/b9edceed1609194878f055ef.html]]></link>
        <description><![CDATA[
		
		<p>
<table cellspacing="0" cellpadding="0" bgcolor="#ffffff" border="0">
    <tbody>
        <tr>
            <td valign="top" align="left" width="502">某天，wangjy和DaoThree在玩多米诺游戏。。。<br>
            　　DaoThree提出一个令wangjy抓头的问题：<br>
            　　有一个m行n列的矩阵，用1*2的骨牌(可横放或竖放)完全覆盖，骨牌不能重叠，有多少种不同的覆盖的方法？<br>
            　　请你帮助wangjy解决:)<br>
            　　wangjy不想看到长串的高精度数，你只需要求出覆盖方法总数mod p 的值即可。<br>
            <br>
            Input (domino.in)<br>
            　　三个整数数n,m,p<br>
            <br>
            Output (domino.out)<br>
            　　一个整数：总数模p的结果<br>
            <br>
            Sample  Input<br>
            　　7 2 10<br>
            <br>
            Sample  Output<br>
            　　1<br>
            <br>
            对样例的说明：<br>
            　　总共有21种方法<br>
            <br>
            约定<br>
            　　m&lt;=5<br>
            　　p&lt;=10000<br>
            　　50%的数据n&lt;=10<br>
            　　100%的数据n&lt;=10000</td>
        </tr>
        <tr>
            <td width="14" background="Skin/Life Azure/Frame_r3_c1.gif" height="14"> </td>
            <td background="Skin/Life Azure/Frame_r3_c2.gif" colspan="2"> </td>
            <td width="14" background="Skin/Life Azure/Frame_r3_c3.gif" height="14"> </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" bgcolor="#ffffff" border="0">
    <tbody>
        <tr>
            <td width="14" background="Skin/Life Azure/Frame_r1_c1.gif" height="14"> </td>
            <td background="Skin/Life Azure/Frame_r1_c2.gif" colspan="2"> </td>
            <td width="14" background="Skin/Life Azure/Frame_r1_c3.gif" height="14"> </td>
        </tr>
        <tr>
            <td background="Skin/Life Azure/Frame_r2_c1.gif" rowspan="2"> </td>
        </tr>
    </tbody>
</table>
因为M只有5,可以用二进制数表示每一列的状态,0表示平直的,1表示凸出的</p>
<p>图例:<br>
　　__<br>
___|....|<br>
......|....|<br>
<br>
0&nbsp;&nbsp;&nbsp;    1&nbsp;&nbsp;  <br>
在一个铺好的图形中,第i行和第i+1行的图案可以用x,y两个数表示,我们可以定义x,y相对应.y在i+1,x在i.若y的对应数是x1,x2 ,x3.....xn<br>
<br>
则方程可以是f[i+1,y]=f[i,x1]+f[i,x2]+f[i,x3]+....+f[i,xn];<br>
<br>
x和y的所有对应关系可以用搜索出来</p>
<p>program jk_domino;<br>
var n,m,p,te,i,j:longint;<br>
&nbsp;&nbsp;&nbsp;  a:array[1..1000,1..2] of longint;<br>
&nbsp;&nbsp;&nbsp;  f:array[0..10000,0..32] of longint;</p>
<p>  procedure doit(k,x,y:longint);<br>
  begin<br>
&nbsp;&nbsp;&nbsp;  if k&gt;m then exit;<br>
&nbsp;&nbsp;&nbsp;  if k=m then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc(te);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  a[te,1]:=x; a[te,2]:=y;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  exit;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  end;<br>
&nbsp;&nbsp;&nbsp;  doit(k+2,x shl 2,y shl 2);{连续在两层放上横的骨牌}<br>
&nbsp;&nbsp;&nbsp;  doit(k+1,x shl 1,(y shl 1)or 1);｛一层竖着放｝<br>
&nbsp;&nbsp;&nbsp;  doit(k+1,(x shl 1)or 1,y shl 1);　｛另一层竖着放｝<br>
  end;</p>
<p>begin<br>
  readln(n,m,p);<br>
  te:=0;<br>
  doit(0,0,0);<br>
  f[0,0]:=1;<br>
  for i:=1 to n do<br>
  for j:=1 to te do<br>
  f[i,a[j,2]]:=(f[i,a[j,2]]+f[i-1,a[j,1]]) mod p;</p>
<p>  writeln(f[n,0] mod p);<br>
end.</p>
<p>搜索构造过程中的三种情况分别是<br>
1:<br>
.__<br>
|__|<br>
|__|<br>
 <br>
  0 0<br>
  0 0<br>
 <br>
  y shl 2 <br>
  x shl 2<br>
<br>
2:<br>
_____<br>
__| .. |<br>
__|__|<br>
<br>
　　...0<br>
　　...1<br>
<br>
　　 y shl 1<br>
　　( x shl 1 )or 1<br>
<br>
3:....__<br>
___| .. |<br>
___|__|<br>
____._|<br>
　　 <br>
　　...1<br>
　　...0<br>
<br>
　　 (y shl 1)or 1<br>
　　  x shl 1</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sixstar/blog/category/%CC%E2%BD%E2">题解</a>&nbsp;<a href="http://hi.baidu.com/sixstar/blog/item/b9edceed1609194878f055ef.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月10日 星期一  下午 03:49</pubDate>
        <category><![CDATA[题解]]></category>
        <author><![CDATA[三角函数sincos]]></author>
		<guid>http://hi.baidu.com/sixstar/blog/item/b9edceed1609194878f055ef.html</guid>
</item>


</channel>
</rss>