﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-旅途愉快！-随笔分类-Dynamic programming</title><link>http://www.cppblog.com/cdy20/category/9815.html</link><description>勇敢.坚毅.智慧</description><language>zh-cn</language><lastBuildDate>Fri, 20 Mar 2009 01:13:26 GMT</lastBuildDate><pubDate>Fri, 20 Mar 2009 01:13:26 GMT</pubDate><ttl>60</ttl><item><title>pku 1088 滑雪</title><link>http://www.cppblog.com/cdy20/archive/2009/03/19/77238.html</link><dc:creator>cdy20</dc:creator><author>cdy20</author><pubDate>Thu, 19 Mar 2009 14:09:00 GMT</pubDate><guid>http://www.cppblog.com/cdy20/archive/2009/03/19/77238.html</guid><wfw:comment>http://www.cppblog.com/cdy20/comments/77238.html</wfw:comment><comments>http://www.cppblog.com/cdy20/archive/2009/03/19/77238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cdy20/comments/commentRss/77238.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cdy20/services/trackbacks/77238.html</trackback:ping><description><![CDATA[<a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1088">http://acm.pku.edu.cn/JudgeOnline/problem?id=1088</a><br>2009年3月19日 星期四<br>dp: re[i][j]=max{四个方向所得的最大值 的最大值}<br><br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;MAX&nbsp;102</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m[MAX][MAX],re[MAX][MAX];<br><img id=Codehighlighter1_99_125_Open_Image onclick="this.style.display='none'; Codehighlighter1_99_125_Open_Text.style.display='none'; Codehighlighter1_99_125_Closed_Image.style.display='inline'; Codehighlighter1_99_125_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_99_125_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_99_125_Closed_Text.style.display='none'; Codehighlighter1_99_125_Open_Image.style.display='inline'; Codehighlighter1_99_125_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;d[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span id=Codehighlighter1_99_125_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_99_125_Open_Text><span style="COLOR: #000000">{</span><span id=Codehighlighter1_100_104_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_100_104_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">,</span><span id=Codehighlighter1_106_111_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_106_111_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">,</span><span id=Codehighlighter1_113_117_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_113_117_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">,</span><span id=Codehighlighter1_119_124_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_119_124_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;r,c;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dfs(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j)<br><img id=Codehighlighter1_159_463_Open_Image onclick="this.style.display='none'; Codehighlighter1_159_463_Open_Text.style.display='none'; Codehighlighter1_159_463_Closed_Image.style.display='inline'; Codehighlighter1_159_463_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_159_463_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_159_463_Closed_Text.style.display='none'; Codehighlighter1_159_463_Open_Image.style.display='inline'; Codehighlighter1_159_463_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_159_463_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_159_463_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(re[i][j])</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;re[i][j];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;maxv</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,tmp;<br><img id=Codehighlighter1_238_444_Open_Image onclick="this.style.display='none'; Codehighlighter1_238_444_Open_Text.style.display='none'; Codehighlighter1_238_444_Closed_Image.style.display='inline'; Codehighlighter1_238_444_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_238_444_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_238_444_Closed_Text.style.display='none'; Codehighlighter1_238_444_Open_Image.style.display='inline'; Codehighlighter1_238_444_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;k</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">k)</span><span id=Codehighlighter1_238_444_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_238_444_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">d[k][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">j</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">d[k][</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_327_438_Open_Image onclick="this.style.display='none'; Codehighlighter1_327_438_Open_Text.style.display='none'; Codehighlighter1_327_438_Closed_Image.style.display='inline'; Codehighlighter1_327_438_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_327_438_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_327_438_Closed_Text.style.display='none'; Codehighlighter1_327_438_Open_Image.style.display='inline'; Codehighlighter1_327_438_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">&gt;-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">y</span><span style="COLOR: #000000">&gt;-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">y</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">c)</span><span id=Codehighlighter1_327_438_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_327_438_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_357_429_Open_Image onclick="this.style.display='none'; Codehighlighter1_357_429_Open_Text.style.display='none'; Codehighlighter1_357_429_Closed_Image.style.display='inline'; Codehighlighter1_357_429_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_357_429_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_357_429_Closed_Text.style.display='none'; Codehighlighter1_357_429_Open_Image.style.display='inline'; Codehighlighter1_357_429_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m[i][j]</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">m[x][y])</span><span id=Codehighlighter1_357_429_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_357_429_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">dfs(x,y)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(tmp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">maxv)maxv</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tmp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;maxv;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_477_856_Open_Image onclick="this.style.display='none'; Codehighlighter1_477_856_Open_Text.style.display='none'; Codehighlighter1_477_856_Closed_Image.style.display='inline'; Codehighlighter1_477_856_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_477_856_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_477_856_Closed_Text.style.display='none'; Codehighlighter1_477_856_Open_Image.style.display='inline'; Codehighlighter1_477_856_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_477_856_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_477_856_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ans</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,tmp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">r,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">r;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br><img id=Codehighlighter1_576_648_Open_Image onclick="this.style.display='none'; Codehighlighter1_576_648_Open_Text.style.display='none'; Codehighlighter1_576_648_Closed_Image.style.display='inline'; Codehighlighter1_576_648_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_576_648_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_576_648_Closed_Text.style.display='none'; Codehighlighter1_576_648_Open_Image.style.display='inline'; Codehighlighter1_576_648_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">c;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">j)</span><span id=Codehighlighter1_576_648_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_576_648_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m[i][j]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re[i][j]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">r;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br><img id=Codehighlighter1_702_780_Open_Image onclick="this.style.display='none'; Codehighlighter1_702_780_Open_Text.style.display='none'; Codehighlighter1_702_780_Closed_Image.style.display='inline'; Codehighlighter1_702_780_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_702_780_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_702_780_Closed_Text.style.display='none'; Codehighlighter1_702_780_Open_Image.style.display='inline'; Codehighlighter1_702_780_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">c;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">j)</span><span id=Codehighlighter1_702_780_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_702_780_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re[i][j]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">dfs(i,j);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(ans</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">re[i][j])ans</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">re[i][j];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,ans</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;system("pause");</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cppblog.com/cdy20/aggbug/77238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cdy20/" target="_blank">cdy20</a> 2009-03-19 22:09 <a href="http://www.cppblog.com/cdy20/archive/2009/03/19/77238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>先写个背包问题模板（01，完全，多重，未测试）</title><link>http://www.cppblog.com/cdy20/archive/2009/03/18/77084.html</link><dc:creator>cdy20</dc:creator><author>cdy20</author><pubDate>Wed, 18 Mar 2009 15:35:00 GMT</pubDate><guid>http://www.cppblog.com/cdy20/archive/2009/03/18/77084.html</guid><wfw:comment>http://www.cppblog.com/cdy20/comments/77084.html</wfw:comment><comments>http://www.cppblog.com/cdy20/archive/2009/03/18/77084.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cdy20/comments/commentRss/77084.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cdy20/services/trackbacks/77084.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">背包问题（</span><span style="COLOR: #000000">01</span><span style="COLOR: #000000">，完全，多重，未测试）<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;MAXN&nbsp;120005&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">maxcash</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;&nbsp;MAX&nbsp;11</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n[MAX],c[MAX];</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">n[i]物品i的数量，c[i]费用，w[i]价值&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;f[MAXN];</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">MAXN为最大容量&nbsp;，存储状态值&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;V,N;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">V最大容量，N物品个数&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_170_180_Open_Image onclick="this.style.display='none'; Codehighlighter1_170_180_Open_Text.style.display='none'; Codehighlighter1_170_180_Closed_Image.style.display='inline'; Codehighlighter1_170_180_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_170_180_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_170_180_Closed_Text.style.display='none'; Codehighlighter1_170_180_Open_Image.style.display='inline'; Codehighlighter1_170_180_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_170_180_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_170_180_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">01背包物品&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;<br><img id=Codehighlighter1_221_356_Open_Image onclick="this.style.display='none'; Codehighlighter1_221_356_Open_Text.style.display='none'; Codehighlighter1_221_356_Closed_Image.style.display='inline'; Codehighlighter1_221_356_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_221_356_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_221_356_Closed_Text.style.display='none'; Codehighlighter1_221_356_Open_Image.style.display='inline'; Codehighlighter1_221_356_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ZeroOnePack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;cost,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;weight)</span><span id=Codehighlighter1_221_356_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_221_356_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">一件01背包物品&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;费用cost，&nbsp;价值weight，01背包&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;v</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">V;v</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">cost;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">v)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[v]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max(f[v],f[v</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">cost]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">weight);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img id=Codehighlighter1_383_610_Open_Image onclick="this.style.display='none'; Codehighlighter1_383_610_Open_Text.style.display='none'; Codehighlighter1_383_610_Closed_Image.style.display='inline'; Codehighlighter1_383_610_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_383_610_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_383_610_Closed_Text.style.display='none'; Codehighlighter1_383_610_Open_Image.style.display='inline'; Codehighlighter1_383_610_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ZeroOnePackMain()</span><span id=Codehighlighter1_383_610_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_383_610_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_388_533_Open_Image onclick="this.style.display='none'; Codehighlighter1_388_533_Open_Text.style.display='none'; Codehighlighter1_388_533_Closed_Image.style.display='inline'; Codehighlighter1_388_533_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_388_533_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_388_533_Closed_Text.style.display='none'; Codehighlighter1_388_533_Open_Image.style.display='inline'; Codehighlighter1_388_533_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_388_533_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_388_533_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">N件物品&nbsp;容量为V的背包，第i件物品费用c[i]，价值w[i],求转入背包可以获取的最大价值&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;原方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;简化方程：f[v]=max{f[v],f[v-cost]+weight};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">N;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroOnePack(cost[i],weight[i]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_616_625_Open_Image onclick="this.style.display='none'; Codehighlighter1_616_625_Open_Text.style.display='none'; Codehighlighter1_616_625_Closed_Image.style.display='inline'; Codehighlighter1_616_625_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_616_625_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_616_625_Closed_Text.style.display='none'; Codehighlighter1_616_625_Open_Image.style.display='inline'; Codehighlighter1_616_625_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_616_625_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_616_625_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">一件完全背包</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;<br><img id=Codehighlighter1_667_913_Open_Image onclick="this.style.display='none'; Codehighlighter1_667_913_Open_Text.style.display='none'; Codehighlighter1_667_913_Closed_Image.style.display='inline'; Codehighlighter1_667_913_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_667_913_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_667_913_Closed_Text.style.display='none'; Codehighlighter1_667_913_Open_Image.style.display='inline'; Codehighlighter1_667_913_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CompletePack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;cost，</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;weight)</span><span id=Codehighlighter1_667_913_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_667_913_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">一件物品完全背包&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">N&nbsp;种物品&nbsp;容量&nbsp;V,c[i],w[i],&nbsp;每一种无限,求最大价值&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;费用cost，&nbsp;价值weight，完全背包&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">对多种物品的问题，可以添加的优化：a.去掉大于V的物品;b.c[i]&lt;=c[j]&nbsp;and&nbsp;w[i]&gt;=w[j]去掉物品j&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;v</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">cost;v</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">V;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">v)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[v]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max(f[v],f[v</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">cost]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">weight);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_917_926_Open_Image onclick="this.style.display='none'; Codehighlighter1_917_926_Open_Text.style.display='none'; Codehighlighter1_917_926_Closed_Image.style.display='inline'; Codehighlighter1_917_926_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_917_926_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_917_926_Closed_Text.style.display='none'; Codehighlighter1_917_926_Open_Image.style.display='inline'; Codehighlighter1_917_926_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_917_926_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_917_926_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">一件多重背包</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_978_1280_Open_Image onclick="this.style.display='none'; Codehighlighter1_978_1280_Open_Text.style.display='none'; Codehighlighter1_978_1280_Closed_Image.style.display='inline'; Codehighlighter1_978_1280_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_978_1280_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_978_1280_Closed_Text.style.display='none'; Codehighlighter1_978_1280_Open_Image.style.display='inline'; Codehighlighter1_978_1280_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;MultiplePack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;cost,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;weight,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;amount)</span><span id=Codehighlighter1_978_1280_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_978_1280_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">多重背包&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">1种物品&nbsp;费用cost，&nbsp;价值weight，个数amount&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">二进制优化log(amount)&nbsp;</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_1065_1128_Open_Image onclick="this.style.display='none'; Codehighlighter1_1065_1128_Open_Text.style.display='none'; Codehighlighter1_1065_1128_Closed_Image.style.display='inline'; Codehighlighter1_1065_1128_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1065_1128_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1065_1128_Closed_Text.style.display='none'; Codehighlighter1_1065_1128_Open_Image.style.display='inline'; Codehighlighter1_1065_1128_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(c</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">amount</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">V)</span><span id=Codehighlighter1_1065_1128_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1065_1128_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompletePack(cost,weight);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_1164_1233_Open_Image onclick="this.style.display='none'; Codehighlighter1_1164_1233_Open_Text.style.display='none'; Codehighlighter1_1164_1233_Closed_Image.style.display='inline'; Codehighlighter1_1164_1233_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1164_1233_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1164_1233_Closed_Text.style.display='none'; Codehighlighter1_1164_1233_Open_Image.style.display='inline'; Codehighlighter1_1164_1233_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(k</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">amount)</span><span id=Codehighlighter1_1164_1233_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1164_1233_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroOnePack(k</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">cost);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount</span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000">k;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroOnePack(amount</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">cost);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cppblog.com/cdy20/aggbug/77084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cdy20/" target="_blank">cdy20</a> 2009-03-18 23:35 <a href="http://www.cppblog.com/cdy20/archive/2009/03/18/77084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku  Cash Machine 多重背包</title><link>http://www.cppblog.com/cdy20/archive/2009/03/18/77079.html</link><dc:creator>cdy20</dc:creator><author>cdy20</author><pubDate>Wed, 18 Mar 2009 14:42:00 GMT</pubDate><guid>http://www.cppblog.com/cdy20/archive/2009/03/18/77079.html</guid><wfw:comment>http://www.cppblog.com/cdy20/comments/77079.html</wfw:comment><comments>http://www.cppblog.com/cdy20/archive/2009/03/18/77079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cdy20/comments/commentRss/77079.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cdy20/services/trackbacks/77079.html</trackback:ping><description><![CDATA[<a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1276">http://acm.pku.edu.cn/JudgeOnline/problem?id=1276</a><br>将第i种面额分成若干面额的bill，这些bill面额为 系数1，2，4，。。。。2^(k-1),n[i]-2^k+1 分别乘以d[i]&nbsp;，&nbsp;并且n[i]-2^k+1&gt;0;<br>(我也是看别人的，找个数试一下就知道了，用这些面额系数就可以，就可以组成&lt;=n[i]的所有可能)<br><br>O(V* <span style="FONT-FAMILY: symbol">S </span>log n[i])<br><br>f[v]表示容量v所能得到的总数<br>简化方程:&nbsp; f[v]=max{f[v],f[v-c]+c}<br>f[]初始都为0<br><br>&nbsp;多重背包 详见<a title="背包九讲&#13;&#10;" href="http://www.concretevitamin.com.cn/informatics/Pack/Index.html">背包九讲</a><br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;MAXN&nbsp;120005&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">maxcash</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;&nbsp;MAX&nbsp;11</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n[MAX],d[MAX];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;f[MAXN];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;V,N;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_153_235_Open_Image onclick="this.style.display='none'; Codehighlighter1_153_235_Open_Text.style.display='none'; Codehighlighter1_153_235_Closed_Image.style.display='inline'; Codehighlighter1_153_235_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_153_235_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_153_235_Closed_Text.style.display='none'; Codehighlighter1_153_235_Open_Image.style.display='inline'; Codehighlighter1_153_235_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ZeroOnePack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c)</span><span id=Codehighlighter1_153_235_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_153_235_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_181_219_Open_Image onclick="this.style.display='none'; Codehighlighter1_181_219_Open_Text.style.display='none'; Codehighlighter1_181_219_Closed_Image.style.display='inline'; Codehighlighter1_181_219_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_181_219_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_181_219_Closed_Text.style.display='none'; Codehighlighter1_181_219_Open_Image.style.display='inline'; Codehighlighter1_181_219_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;v</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">V;v</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">c;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">v)</span><span id=Codehighlighter1_181_219_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_181_219_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[v]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max(f[v],f[v</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">c]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_262_342_Open_Image onclick="this.style.display='none'; Codehighlighter1_262_342_Open_Text.style.display='none'; Codehighlighter1_262_342_Closed_Image.style.display='inline'; Codehighlighter1_262_342_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_262_342_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_262_342_Closed_Text.style.display='none'; Codehighlighter1_262_342_Open_Image.style.display='inline'; Codehighlighter1_262_342_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CompletePack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c)</span><span id=Codehighlighter1_262_342_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_262_342_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_289_327_Open_Image onclick="this.style.display='none'; Codehighlighter1_289_327_Open_Text.style.display='none'; Codehighlighter1_289_327_Closed_Image.style.display='inline'; Codehighlighter1_289_327_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_289_327_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_289_327_Closed_Text.style.display='none'; Codehighlighter1_289_327_Open_Image.style.display='inline'; Codehighlighter1_289_327_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;v</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">c;v</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">V;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">v)</span><span id=Codehighlighter1_289_327_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_289_327_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[v]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max(f[v],f[v</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">c]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img id=Codehighlighter1_382_605_Open_Image onclick="this.style.display='none'; Codehighlighter1_382_605_Open_Text.style.display='none'; Codehighlighter1_382_605_Closed_Image.style.display='inline'; Codehighlighter1_382_605_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_382_605_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_382_605_Closed_Text.style.display='none'; Codehighlighter1_382_605_Open_Image.style.display='inline'; Codehighlighter1_382_605_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;MultiplePack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;amount)</span><span id=Codehighlighter1_382_605_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_382_605_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img id=Codehighlighter1_406_459_Open_Image onclick="this.style.display='none'; Codehighlighter1_406_459_Open_Text.style.display='none'; Codehighlighter1_406_459_Closed_Image.style.display='inline'; Codehighlighter1_406_459_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_406_459_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_406_459_Closed_Text.style.display='none'; Codehighlighter1_406_459_Open_Image.style.display='inline'; Codehighlighter1_406_459_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(c</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">amount</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">V)</span><span id=Codehighlighter1_406_459_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_406_459_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompletePack(c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_495_561_Open_Image onclick="this.style.display='none'; Codehighlighter1_495_561_Open_Text.style.display='none'; Codehighlighter1_495_561_Closed_Image.style.display='inline'; Codehighlighter1_495_561_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_495_561_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_495_561_Closed_Text.style.display='none'; Codehighlighter1_495_561_Open_Image.style.display='inline'; Codehighlighter1_495_561_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(k</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">amount)</span><span id=Codehighlighter1_495_561_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_495_561_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroOnePack(k</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount</span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000">k;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroOnePack(amount</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_622_1170_Open_Image onclick="this.style.display='none'; Codehighlighter1_622_1170_Open_Text.style.display='none'; Codehighlighter1_622_1170_Closed_Image.style.display='inline'; Codehighlighter1_622_1170_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_622_1170_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_622_1170_Closed_Text.style.display='none'; Codehighlighter1_622_1170_Open_Image.style.display='inline'; Codehighlighter1_622_1170_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_622_1170_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_622_1170_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a,b;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_680_1151_Open_Image onclick="this.style.display='none'; Codehighlighter1_680_1151_Open_Text.style.display='none'; Codehighlighter1_680_1151_Closed_Image.style.display='inline'; Codehighlighter1_680_1151_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_680_1151_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_680_1151_Closed_Text.style.display='none'; Codehighlighter1_680_1151_Open_Image.style.display='inline'; Codehighlighter1_680_1151_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">V,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">N)</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">EOF)</span><span id=Codehighlighter1_680_1151_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_680_1151_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">V</span><span style="COLOR: #000000">&amp;&amp;!</span><span style="COLOR: #000000">N)</span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;flag</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">V;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)f[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;memset(f,0,sizeof(f));</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_830_940_Open_Image onclick="this.style.display='none'; Codehighlighter1_830_940_Open_Text.style.display='none'; Codehighlighter1_830_940_Closed_Image.style.display='inline'; Codehighlighter1_830_940_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_830_940_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_830_940_Closed_Text.style.display='none'; Codehighlighter1_830_940_Open_Image.style.display='inline'; Codehighlighter1_830_940_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">N;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)</span><span id=Codehighlighter1_830_940_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_830_940_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a,d[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">b;<br><img id=Codehighlighter1_915_930_Open_Image onclick="this.style.display='none'; Codehighlighter1_915_930_Open_Text.style.display='none'; Codehighlighter1_915_930_Closed_Image.style.display='inline'; Codehighlighter1_915_930_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_915_930_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_915_930_Closed_Text.style.display='none'; Codehighlighter1_915_930_Open_Image.style.display='inline'; Codehighlighter1_915_930_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(d[i]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">V)</span><span id=Codehighlighter1_915_930_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_915_930_Open_Text><span style="COLOR: #000000">{f[V]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">V;flag</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(V</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)f[V]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,flag</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_992_1113_Open_Image onclick="this.style.display='none'; Codehighlighter1_992_1113_Open_Text.style.display='none'; Codehighlighter1_992_1113_Closed_Image.style.display='inline'; Codehighlighter1_992_1113_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_992_1113_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_992_1113_Closed_Text.style.display='none'; Codehighlighter1_992_1113_Open_Image.style.display='inline'; Codehighlighter1_992_1113_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">flag)</span><span id=Codehighlighter1_992_1113_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_992_1113_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">N;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(n[i]</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">d[i]</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">V)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultiplePack(d[i],n[i]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,f[V]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</span></span></div>
<br><br><br>
<img src ="http://www.cppblog.com/cdy20/aggbug/77079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cdy20/" target="_blank">cdy20</a> 2009-03-18 22:42 <a href="http://www.cppblog.com/cdy20/archive/2009/03/18/77079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态规划相关资料</title><link>http://www.cppblog.com/cdy20/archive/2009/03/18/77054.html</link><dc:creator>cdy20</dc:creator><author>cdy20</author><pubDate>Wed, 18 Mar 2009 11:53:00 GMT</pubDate><guid>http://www.cppblog.com/cdy20/archive/2009/03/18/77054.html</guid><wfw:comment>http://www.cppblog.com/cdy20/comments/77054.html</wfw:comment><comments>http://www.cppblog.com/cdy20/archive/2009/03/18/77054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cdy20/comments/commentRss/77054.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cdy20/services/trackbacks/77054.html</trackback:ping><description><![CDATA[一些题目：<br>&nbsp;&nbsp;&nbsp;&nbsp; 背包问题. (poj1837,poj1276)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; 型如下表的简单DP(可参考lrj的书 page149):&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (poj3176,poj1080,poj1159)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; 较为复杂的动态规划(如动态规划解特别的施行商问题等)&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; 记录状态的动态规划. (POJ3254,poj2411,poj1185)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;树型动态规划(poj2057,poj1947,poj2486,poj3140)&nbsp;&nbsp;<a title=背包九讲 href="http://www.concretevitamin.com.cn/informatics/Pack/Index.html"><br><br><br>背包九讲</a>&nbsp;&nbsp; <a href="http://www.concretevitamin.com.cn/informatics/Pack/Index.html">http://www.concretevitamin.com.cn/informatics/Pack/Index.html</a> 
<img src ="http://www.cppblog.com/cdy20/aggbug/77054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cdy20/" target="_blank">cdy20</a> 2009-03-18 19:53 <a href="http://www.cppblog.com/cdy20/archive/2009/03/18/77054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku   1837 Balance</title><link>http://www.cppblog.com/cdy20/archive/2009/03/17/76915.html</link><dc:creator>cdy20</dc:creator><author>cdy20</author><pubDate>Tue, 17 Mar 2009 12:43:00 GMT</pubDate><guid>http://www.cppblog.com/cdy20/archive/2009/03/17/76915.html</guid><wfw:comment>http://www.cppblog.com/cdy20/comments/76915.html</wfw:comment><comments>http://www.cppblog.com/cdy20/archive/2009/03/17/76915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cdy20/comments/commentRss/76915.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cdy20/services/trackbacks/76915.html</trackback:ping><description><![CDATA[<a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1837">http://acm.pku.edu.cn/JudgeOnline/problem?id=1837</a>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;MAX&nbsp;10000</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;base&nbsp;5000</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;hmax&nbsp;21</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m[hmax][MAX];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;h[hmax],w[hmax];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c,g;<br><img id=Codehighlighter1_141_238_Open_Image onclick="this.style.display='none'; Codehighlighter1_141_238_Open_Text.style.display='none'; Codehighlighter1_141_238_Closed_Image.style.display='inline'; Codehighlighter1_141_238_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_141_238_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_141_238_Closed_Text.style.display='none'; Codehighlighter1_141_238_Open_Image.style.display='inline'; Codehighlighter1_141_238_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_141_238_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_141_238_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m[i,j]表示前i个位置&nbsp;得到力矩为j的方案的&nbsp;数目<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m[i][j]=&#931;m[i-1,j-w[i]*h[k]]&nbsp;&nbsp;&nbsp;i砝码数&nbsp;&nbsp;k位置<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base避免负数&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_251_939_Open_Image onclick="this.style.display='none'; Codehighlighter1_251_939_Open_Text.style.display='none'; Codehighlighter1_251_939_Closed_Image.style.display='inline'; Codehighlighter1_251_939_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_251_939_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_251_939_Closed_Text.style.display='none'; Codehighlighter1_251_939_Open_Image.style.display='inline'; Codehighlighter1_251_939_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_251_939_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_251_939_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_287_921_Open_Image onclick="this.style.display='none'; Codehighlighter1_287_921_Open_Text.style.display='none'; Codehighlighter1_287_921_Closed_Image.style.display='inline'; Codehighlighter1_287_921_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_287_921_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_287_921_Closed_Text.style.display='none'; Codehighlighter1_287_921_Open_Image.style.display='inline'; Codehighlighter1_287_921_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">c,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">g)</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">EOF)</span><span id=Codehighlighter1_287_921_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_287_921_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">c;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">h[i]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">g;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">w[i]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(m,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(m));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">c;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">][w[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">h[i]</span><span style="COLOR: #000000">+</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">g;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br><img id=Codehighlighter1_586_818_Open_Image onclick="this.style.display='none'; Codehighlighter1_586_818_Open_Text.style.display='none'; Codehighlighter1_586_818_Closed_Image.style.display='inline'; Codehighlighter1_586_818_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_586_818_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_586_818_Closed_Text.style.display='none'; Codehighlighter1_586_818_Open_Image.style.display='inline'; Codehighlighter1_586_818_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=-</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">;j</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">j)</span><span id=Codehighlighter1_586_818_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_586_818_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;tmp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;k</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">c;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">k)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;m[i</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">][</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">j</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">h[k]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">w[i]])tmp</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">m[i</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">][</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">j</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">h[k]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">w[i]];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m[i][</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">j]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tmp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,m[g</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">][</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br><br><br>继续幼稚地保留代码，并贴出出来。 
<img src ="http://www.cppblog.com/cdy20/aggbug/76915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cdy20/" target="_blank">cdy20</a> 2009-03-17 20:43 <a href="http://www.cppblog.com/cdy20/archive/2009/03/17/76915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态规划总结(by Amber)</title><link>http://www.cppblog.com/cdy20/archive/2009/03/17/76889.html</link><dc:creator>cdy20</dc:creator><author>cdy20</author><pubDate>Tue, 17 Mar 2009 10:36:00 GMT</pubDate><guid>http://www.cppblog.com/cdy20/archive/2009/03/17/76889.html</guid><wfw:comment>http://www.cppblog.com/cdy20/comments/76889.html</wfw:comment><comments>http://www.cppblog.com/cdy20/archive/2009/03/17/76889.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cdy20/comments/commentRss/76889.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cdy20/services/trackbacks/76889.html</trackback:ping><description><![CDATA[&nbsp;
<p align=center><strong><font face=宋体 size=6><span>动态规划总结</span></font></strong><strong><font size=6></font></strong></p>
<p align=right><font face="Times New Roman" size=2><span><span>by Amber</span></span></font></p>
<h1><strong><font face="Times New Roman" size=6><span><span>1.<font face="Times New Roman" size=1><span>&nbsp;&nbsp; </span></font></span></span></font></strong><font face=宋体><span>按状态类型分</span></font></h1>
<p><font face=宋体 size=2><span><span>写在前面：</span></span></font></p>
<p><font face=宋体 size=2><span><span>从状态类型分，并不表示一题只从属于一类。其实一类只是一种状态的表示方法。可以好几种方法组合成一个状态，来解决问题。</span></span></font></p>
<h2><strong><font face=Arial size=5><span><span>1.1.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>编号（长度）动态规划</span></font></h2>
<p><strong><font face=宋体 size=2><span><span>共性总结</span></span></font></strong></p>
<p><font face=宋体 size=2><span><span>本类的状态是基础的基础，大部分的动态规划都要用到它，成为一个维。</span></span></font></p>
<p><font face=宋体 size=2><span><span>一般来说，有两种编号的状态：</span></span></font></p>
<p><font face=宋体 size=2><span><span>状态</span></span></font><span>(i)</span><font face=宋体><span>表示前</span></font><span>i</span><font face=宋体><span>个元素决策组成的一个状态。</span></font></p>
<p><font face=宋体 size=2><span><span>状态</span></span></font><span>(i)</span><font face=宋体><span>表示用到了第</span></font><span>i</span><font face=宋体><span>个元素，和其他在</span></font><span>1</span><font face=宋体><span>到</span></font><span>i-1</span><font face=宋体><span>间的元素，决策组成有的一个状态。</span></font><strong></strong></p>
<p><strong><font face=宋体 size=2><span><span>题库</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>最长不下降子序列</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>以一元组</span></span></font><span>(i)</span><font face=宋体><span>作为状态，表示第</span></font><span>i</span><font face=宋体><span>个作为序列的最后一个点的时候的最长序列。于是很容易想到</span></font><span>O(n<sup>2</sup>)</span><font face=宋体><span>得算法。但本题可<font color=red><span>合理组织状态</span></font>，引入一个单调的辅助数组，利用单调性二分查找，优化到</span></font><span>O(nlogn)</span><font face=宋体><span>。关于优化详见优化章。</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>一些问题可将数据<font color=red><span>有序化</span></font>，转化成本题。</span></span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>应用：</span></font></p>
<p><font face=宋体 color=#3366ff size=2><span><span>拦截导弹</span></span></font><span>(NOIP99 Advance 1) </span><font face=宋体><span>就是原题。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>Beautiful People </span></span></font><span>(sgu199)</span><font face=宋体><span>，要将数据有序化：其中一个权作为第一关键字不下降排列，另一个权作为第二关键字不上升。</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>Segment</span></span></font><span> (ural 1078)</span><font face=宋体><span>，将线段的左端点有序化就可以了。</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font color=#3366ff><span>LCS</span></font></p>
<p><font face=宋体 size=2><span><span>状态</span></span></font><span>(i,j)</span><font face=宋体><span>，表示第</span></font><span>1</span><font face=宋体><span>个字符串的第</span></font><span>i</span><font face=宋体><span>位，与第</span></font><span>2</span><font face=宋体><span>个字符串的第</span></font><span>j</span><font face=宋体><span>位匹配，得到的最长的串。若有多个串要</span></font><span>LCS</span><font face=宋体><span>，则加维，即几个串就几个维。我也将此题归入<strong><span>路径问题。</span></strong></span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>c)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>花店橱窗布置</span></font><span>(IOI99)</span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>见<strong><span>路径问题。</span></strong></span></font></p>
<h2><strong><font face=Arial size=5><span><span>1.2.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>区间动态规划</span></font></h2>
<p><strong><font face=宋体 size=2><span><span>共性总结</span></span></font></strong></p>
<p><strong><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font></strong><font face=宋体><span>本类问题与下一章的<strong><span>划分问题</span></strong>的<strong><span>决策的分割点无序</span></strong>交集比较大（占本类问题的</span></font><span>30%</span><font face=宋体><span>）。</span></font></p>
<p><strong><font face=宋体 size=2><span><span>题库</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>石子合并</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>见<strong><span>划分问题</span></strong></span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>模版匹配</span></font><span>(CEOI01,Patten)</span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>这题特殊的地方是状态的值是一个集合而不是一个数。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>c)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>不可分解的编码</span></font><span>(ACM World Final 2002)</span></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>d)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font color=#3366ff><span>Electric Path</span></font><span>(ural1143)</span></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>e)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>邮局</span></font><span>(IOI2000 Day2 1)<font color=#3366ff></font></span></p>
<p><font face=宋体 size=2><span><span>若状态表示的思路从第</span></span></font><span>i</span><font face=宋体><span>个村庄可以从属于哪个邮局，无最优子结构。转变一个方向：第</span></font><span>k</span><font face=宋体><span>个邮局可以&#8220;控制&#8221;一个区间的村庄</span></font><span>[i,j]</span><font face=宋体><span>。于是方程就显然了</span></font><span>:</span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>f(k,i,j)=min{f(k-1,p,i-1)+w(i,j)}(k-1&lt;=p&lt;=i-1)</span></span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>S(i) </span></font><font face=宋体><span>为村庄</span></font><span>i</span><font face=宋体><span>到原点的距离。</span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>w(i,j)=min{k| Sum{|S(k)-S(p)|}(i&lt;=p&lt;=j)}(i&lt;=k&lt;=j) </span></span></font><font face=宋体><span>找到</span></font><span>[i,j]</span><font face=宋体><span>间最好的一个邮局点。</span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>不过可以发现</span></font><span>Sum{|S(k)-S(p)|</span><font face=宋体><span>是单调的，所以取中位数就可以了。即上式中</span></font><span>k</span><font face=宋体><span>的取值范围只有</span></font><span>floor((i+j)/2), ceil((i+j)/2)</span><font face=宋体><span>两个。</span></font><span>Floor</span><font face=宋体><span>是下取整。</span></font><span>Ceil</span><font face=宋体><span>是上取整。这样每次转移时间降到</span></font><span>O(1)</span><font face=宋体><span>。</span></font></p>
<p><font face=宋体 size=2><span><span>注意到是区间连续的，即</span></span></font><span>(p,i-1) </span><font face=宋体><span>和</span></font><span>(i, j) </span><font face=宋体><span>中的</span></font><span> i-1, i</span><font face=宋体><span>是连续的，所以空间可以降维：</span></font><span>f(i,j)</span><font face=宋体><span>表示放前</span></font><span>i</span><font face=宋体><span>个邮局到前</span></font><span>j</span><font face=宋体><span>个村庄的最优值。</span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>f(i,j)=min{f(i-1,p-1)+w(p,j)}(i-1&lt;=p&lt;=j-1}</span></span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>e(i,j) </span></span></font><font face=宋体><span>为当</span></font><span>f(i,j)</span><font face=宋体><span>到达最优值时的</span></font><span>p.</span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>通过证明四边形不等式，得到</span></font><span>e(i,j)&lt;=e(i,j+1)&lt;=e(i+1,j+1)</span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>决策数量又少了一个数量级。</span></font></p>
<h2><strong><font face=Arial size=5><span><span>1.3.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>坐标动态规划</span></font></h2>
<p><strong><font face=宋体 size=2><span><span>共性总结</span></span></font></strong></p>
<p><font face=宋体 size=2><span><span>之后的一些问题，状态是由坐标维与其他的维组成。本类与<strong><span>划分问题</span></strong></span></span></font><span>(</span><font face=宋体><span>是</span></font><span>2</span><font face=宋体><span>维或多维的坐标系的划分</span></font><span>)</span><font face=宋体><span>与<strong><span>路径问题</span></strong>的交集占本类问题中大多数。</span></font></p>
<p><strong><font face=宋体 size=2><span><span>题库</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>棋盘分割</span></font><span>(NOI99 4)<font color=#3366ff></font></span></p>
<p><font face=宋体 size=2><span><span>主要是将公式变形，变形后的公式很容易看出方程。</span></span></font></p>
<p><font face=宋体 size=2><span><span>状态是由</span></span></font><span>2</span><font face=宋体><span>个坐标组成的</span></font><span>4</span><font face=宋体><span>元组</span></font><span>(x1,y1)(x2,y2)</span><font face=宋体><span>，表示一个子棋盘。这有点像之前的区间动态规划，只不过是将</span></font><span>1</span><font face=宋体><span>维转</span></font><span>2</span><font face=宋体><span>维。</span></font></p>
<p><font face=宋体 size=2><span><span>后见<strong><span>路径问题。</span></strong></span></span></font></p>
<h2><strong><font face=Arial size=5><span><span>1.4.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>数轴动态规划</span></font></h2>
<p><strong><font face=宋体 size=2><span><span>共性总结</span></span></font></strong></p>
<p><strong><font face="Times New Roman" size=2>&nbsp;</font></strong></p>
<p><strong><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font></strong><strong><font face=宋体><span>题库</span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font color=#3366ff><span>01</span></font><font face=宋体 color=#3366ff><span>背包</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>应用：</span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体 color=#3366ff><span>装箱问题</span></font><font face=宋体><span>（</span></font><span>NOIP01 Trade 4</span><font face=宋体><span>）</span></font></p>
<p><font face=宋体 size=2><span><span>就是原题。</span></span></font><font color=#3366ff></font></p>
<p><font face=宋体 color=#3366ff size=2><span><span>值币分割</span></span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>可利用方程的性质，空间降</span></font><span>1</span><font face=宋体><span>维。</span></font></p>
<p><font face=宋体 color=#3366ff size=2><span><span>币值可重复的值币分割</span></span></font><span>(pku1742</span><span>, Problem F LouTianCheng&#8217;s Contest in POJ)</span></p>
<p><font face=宋体 size=2><span><span>使用左右法在定位上加速。</span></span></font></p>
<p><font face=宋体 size=2><span><span>另给状态加一个属性</span></span></font><span>last,</span><font face=宋体><span>记录上一次剩下的可用的同币值硬币数（利用了当前转移是唯一前驱的特点）。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>取火柴问题</span></font><span>(sgu153 Playing with matches)</span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font color=#3366ff></font></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>c)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font color=#3366ff><span>Stone Pile</span></font><span>(ural1005 Stone Pile)<font color=#3366ff></font></span></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>d)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>公路巡逻</span></font><span>(CTSC2000)<strong></strong></span></p>
<h2><strong><font face=Arial size=5><span><span>1.5.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><span>5.</span><font face=黑体><span>树型动态规划</span></font></h2>
<p><strong><font face=宋体 size=2><span><span>共性总结</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>1）<font face="Times New Roman" size=1>&nbsp;</font></span></span></font><font face=宋体 color=#3366ff><span>动态规划的顺序</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>一般按照后序遍历的顺序，即处理完儿子再处理当前节点，才符合树的子结构的性质。</span></span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>2）<font face="Times New Roman" size=1>&nbsp;</font></span></span></font><font face=宋体 color=#3366ff><span>多叉树转换为二叉树</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>由于要分配附加维到各个节点，而分配附加维是个划分问题，若还是按当前节点到各个儿子节点分配，则成了一个<strong><font color=red><span>整数划分</span></font></strong>问题</span></span></font><span>,O(n<sub>&shy;</sub><sup>2</sup>)</span><font face=宋体><span>。所以要把多叉树转换为二叉树，这样才能按动态规划的方式只决策当前点的分配问题</span></font><span>, O(n<sub>&shy;</sub>)</span><font face=宋体><span>。</span></font><sup></sup></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>3）<font face="Times New Roman" size=1>&nbsp;</font></span></span></font><font face=宋体 color=#3366ff><span>加当前点的选或不选的常数维</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>加此维解决的是后效性问题。</span></font></p>
<p><font face=宋体 size=2><span><span>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</span></span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>4）<font face="Times New Roman" size=1>&nbsp;</font></span></span></font><font face=宋体 color=#3366ff><span>在将边信息转成树时的技巧</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>将读入的边分裂成</span></span></font><span>2</span><font face=宋体><span>条边，将这</span></font><span>2</span><font face=宋体><span>条边关联起来（就是找到一条边，另一条边的编号就知道）。用<strong><font color=red><span>前向星表示法</span></font></strong>表示边（按起点有序），以后用边的时候，用了一条边打不可用标志，也将关联边打不可用标志。这样可以保证</span></font><span>O(n)</span><font face=宋体><span>的时间完成信息处理，而且在父节点找儿子的过程中带来很大的方便。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>5）<font face="Times New Roman" size=1>&nbsp;</font></span></span></font><font face=宋体 color=#3366ff><span>复杂度</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>树型动态规划复杂度基本上是</span></span></font><span>O(n)</span><font face=宋体><span>；若有附加维</span></font><span>m</span><font face=宋体><span>，则是</span></font><span>O(nm)</span><font face=宋体><span>。</span></font></p>
<p><strong><font face=宋体 size=2><span><span>题库</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>选课</span></font><span>(CTSC97-3)<font color=#3366ff></font></span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>由于要分配课程数，所以要多叉树转换为二叉树。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>贪吃的九头龙</span></font><span>(NOI02-3)<font color=#3366ff></font></span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>若小头数大于</span></font><span>1</span><font face=宋体><span>的话，则让不同的小头吃一段树枝的</span></font><span>2</span><font face=宋体><span>个端点。</span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>这样就把问题转化成：附加维是大头吃的个数，当前点由不由大头吃的常数维的动态规划。由于涉及划分问题，所以要多叉树转换为二叉树。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>c)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>求树的质心</span></font><span>(sgu134 Centroid)<font color=#3366ff></font></span></p>
<p><font face=宋体 size=2><span><span>给出一棵边不带权的树，求点</span></span></font><span>,</span><font face=宋体><span>使得去掉此点后</span></font><span>,</span><font face=宋体><span>剩下的最大的连通子图的顶点数最小</span></font><span>.</span></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>d)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>求树中的点最远距离最近。</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>给出一棵边带权的树，求树中的点，使得此点到树中的其他结点的最远距离最近。</span></span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>Computer Network</span></span></font><span> (sgu149<font color=black><span>)</span></font></span></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>Computer Net </span></span></font><font color=black><span>(ural1056)</span></font></p>
<h2><strong><font face=Arial size=5><span><span>1.6.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>集合动态规划（状态压缩）</span></font></h2>
<p><strong><font face=宋体 size=2><span><span>共性总结</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>1)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>数据特殊性</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>给出的数据在某一个或几个维度上一般具有比较小的范围（可以枚举一类的状态）。</span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>一个枚举的状态是一个集合。</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>2)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>编码</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>由于集合中元素个数的不定性或范围大，直接开数组存，不好索引数组（编程复杂度太高），所以要将集合编码。</span></span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>利用数据的可枚举性，将枚举的状态</span></span></font><span>(</span><font face=宋体><span>集合</span></font><span>)</span><font face=宋体><span>编码。一般来说码值的范围要很小（尽量排除无用的码值，如炮兵：当前格和上格存在炮兵的情况是非法的，可以排除）。</span></font></p>
<p><font face=宋体 size=2><span><span>规定编码的码值代表的意思，要尽量规定好维护的码值。（如炮兵：当前格存在炮兵的用</span></span></font><span>2</span><font face=宋体><span>，上格存在炮兵用</span></font><span>1</span><font face=宋体><span>。这样下一层的规划时，只要码值</span></font><span>-1</span><font face=宋体><span>即可）。</span></font></p>
<p><font face=宋体 size=2><span><span>有时候可以直接利用编码的顺序动态规划，因为这时编码已经是<font color=red><span>拓补有序</span></font>。如</span></span></font><span>TSP</span><font face=宋体><span>问题当前已选点集合的状态的前驱的编码的值一定比当前的编码的值小。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>3)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>状态压缩</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>对有限阶段的放置情况，行走情况编码（其实质也是放置的集合或行走路线的集合），这样的编码，也有人谓之：&#8220;状态压缩&#8221;。此类题以&#8220;炮兵阵地&#8221;为典型，进行扩展。</span></span></font></p>
<p><strong><font face=宋体 size=2><span><span>题库</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>购物</span></font><font face=宋体><span>（</span></font><span>IOI95-2</span><font face=宋体><span>）</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>可将每种物品按</span></font><span>5</span><font face=宋体><span>进制编码。（</span></font><span>5</span><font face=宋体><span>为每种物品数的上限）</span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>由于物品数的上限为</span></font><span>5</span><font face=宋体><span>，比较小，也可直接开数组存。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font color=#3366ff><span>Roger</span></font><font face=宋体 color=#3366ff><span>游戏任务一</span></font><font face=宋体><span>（</span></font><span>CTSC98 Day2 4</span><font face=宋体><span>）</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>一个正方体在一个方格内的状态只有</span></font><span>24</span><font face=宋体><span>种，而且可以通过顶面和前面来表示，这样用</span></font><span>3</span><font face=宋体><span>维的状态</span></font><span>(x,y,p)</span><font face=宋体><span>就可以解决，</span></font><span>p</span><font face=宋体><span>为</span></font><span>1</span><font face=宋体><span>到</span></font><span>24</span><font face=宋体><span>种状态中的一种。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>c)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font color=#3366ff><span>TSP</span></font><font face=宋体 color=#3366ff><span>问题</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>观察一下</span></span></font><span>TSP</span><font face=宋体><span>的搜索过程：</span></font><span> for (x in </span><font face=宋体><span>未选点</span></font><span>) TSP(x)</span></p>
<p><font face=宋体 size=2><span><span>即当前路的最后一个节点为</span></span></font><span>x,</span><font face=宋体><span>现在要选择下一个节点</span></font><span>y,</span><font face=宋体><span>而</span></font><span>y</span><font face=宋体><span>要在未选点的集合中。若未选点或已选点的集合已确定，则后效性消除。可以</span></font><span>DP</span><font face=宋体><span>。状态为令</span></font><span>X</span><font face=宋体><span>为当前路的已选点的集合</span></font><span>(</span><font face=宋体><span>含</span></font><span>i)</span><font face=宋体><span>，当前路的最后一个节点为</span></font><span>i</span><font face=宋体><span>。</span></font><span>2</span><font face=宋体><span>元组</span></font><span>(X,i)</span><font face=宋体><span>为经过已选点的集合</span></font><span>X</span><font face=宋体><span>到节点</span></font><span>i</span><font face=宋体><span>的最短长度。将</span></font><span>X</span><font face=宋体><span>编码即可。</span></font></p>
<p><font face=宋体 size=2><span><span>注意：<font color=red><span>并没有因为动态规划将问题从</span></font></span></span></font><font color=red><span>NP</span></font><font face=宋体 color=red><span>类带到</span></font><font color=red><span>P</span></font><font face=宋体 color=red><span>类</span></font><font face=宋体><span>。</span></font></p>
<p><font face=宋体 size=2><span><span>应用</span></span></font><span>: <font color=#3366ff><span>DNA Laboratory</span></font>(Problem B,TU-Darmstadt Programming Contest 2004)</span></p>
<p><font face=宋体 size=2><span><span>将每个串的交迭部分求出，就可以将问题专成</span></span></font><span>TSP</span></p>
<p><font face=宋体 size=2><span><span>但要输出字典序最小的，则需要注意</span></span></font><span>DP</span><font face=宋体><span>顺序。</span></font></p>
<p><font face=宋体 size=2><span><span>有具体的报告。</span></span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>d)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>炮兵阵地</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>十分经典，详见<font color=red><span>报告</span></font>。</span></span></font></p>
<p><font face=宋体 size=2><span><span>应用</span></span></font><span>:</span></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>Another Chocolate Maniac</span></span></font><span>(sgu132) </span><font face=宋体><span>类似炮兵的做法的最值，只不过是求最小值，麻烦点。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>Hardwood floor</span></span></font><span>(sgu131) </span><font face=宋体><span>类似炮兵的做法的统计</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>Little Knights</span></span></font><span>(sgu225) </span><font face=宋体><span>类似炮兵的做法的统计</span></font><span>,</span><font face=宋体><span>数据量太大要</span></font><span>const</span></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>Little Kings</span></span></font><span>(sgu223) </span><font face=宋体><span>类似炮兵的做法的统计</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>Bugs</span></span></font><font face=宋体 color=#3366ff><span>公司</span></font><span>(CEOI 2002) </span><font face=宋体><span>类似炮兵的做法的最值</span></font></p>
<h2><strong><font face=Arial size=5><span><span>1.7.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>利用动态规划思想求最值，编号（循环变量）的迭代</span></font></h2>
<p><strong><font face=宋体 size=2><span><span>共性总结</span></span></font></strong></p>
<p><strong><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font></strong><font face=宋体><span>要利用上次的一些运算&#8220;剩下&#8221;的循环变量作当前循环的边界，主要在于找出一种决策顺序，使之成立。</span></font></p>
<p><strong><font face=宋体 size=2><span><span>题库</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>奶牛浴场</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font color=#3366ff><span>Communication System</span></font></p>
<p><font face=宋体 size=2><span><span>将数据有序化</span></span></font><span>, </span><font face=宋体><span>从大到小枚举带宽</span></font><span>, </span><font face=宋体><span>每次可利用上次处理的结果</span></font><span>Min, </span><font face=宋体><span>来决策当前状态。称作迭代</span></font><span>, </span><font face=宋体><span>或就是一种动态规划。</span></font></p>
<p><font face="Times New Roman" size=2><span><span>(zju1409, Problem C Tehran 2002 Iran Nationwide Internet Programming Contest)</span></span></font></p>
<h2><strong><font face=Arial size=5><span><span>1.8.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>记忆化搜索</span></font></h2>
<p><strong><font face=宋体 size=2><span><span>题库</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font color=#3366ff><span>Magic Trick</span></font><span> (Problem G, TU-Darmstadt Programming Contest 2004)<font color=#3366ff></font></span></p>
<h1><strong><font face="Times New Roman" size=6><span><span>2.<font face="Times New Roman" size=1><span>&nbsp;&nbsp; </span></font></span></span></font></strong><font face=宋体><span>按转移方式分</span></font></h1>
<h2><strong><font face=Arial size=5><span><span>2.1.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>存在性</span></font></h2>
<p><strong><font face=宋体 size=2><span><span>递推</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>1)01</span></span></font><font face=宋体 color=#3366ff><span>统计</span></font><span>(CTSC99 1)</span></p>
<p><font face="Times New Roman" size=2><span><span>2)</span></span></font><font face=宋体><span>卡特兰数</span></font></p>
<p><font face="Times New Roman" size=2><span><span>circle(sgu130)</span></span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>3)</span></span></font><font face=宋体><span>鹰蛋</span></font></p>
<h2><strong><font face=Arial size=5><span><span>2.2.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>求一系列的分割（合并）点（划分问题）</span></font></h2>
<h3><strong><font face="Times New Roman" size=5><span><span>2.2.1.<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp; </span></font></span></span></font></strong><font face=宋体><span>决策的分割点有序</span></font></h3>
<p><strong><font face=宋体 size=2><span><span>共性总结</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>有<span>序性</span></span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>每次决策的点的编号是有序的，即要按决策的顺序输出分割点的编号的话，编号是有序的，满足分割点的编号按升序排列。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>方程一般形式</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>f(n,m)=optimize{f(k,m-1)+w(k+1,n)}</span></span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>(n,m)</span></span></font><font face=宋体><span>表示从</span></font><span>1</span><font face=宋体><span>到</span></font><span>n</span><font face=宋体><span>个点中划分为</span></font><span>m</span><font face=宋体><span>个部分的最优值；</span></font><span>k</span><font face=宋体><span>为决策的分割点，即第</span></font><span>m</span><font face=宋体><span>个部分为</span></font><span>k+1</span><font face=宋体><span>到</span></font><span>n</span><font face=宋体><span>；这里</span></font><span>optimize</span><font face=宋体><span>可以为</span></font><span>max,min</span><font face=宋体><span>。</span></font></p>
<p><strong><font face=宋体 size=2><span><span>题库</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>整数划分</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>常应用在将一个权分配给一定的小分割块，如：将大堆的石子分成一定的小堆，小堆可为空，大堆要分完。有时应用在树型动态规划（二叉转多叉）中。</span></span></font></p>
<p><font face="Times New Roman" size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>乘积最大</span></font><span>(NOIP00 Advance 2)</span></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>就是按上面的一般式的方程做。</span></font></p>
<p><font face="Times New Roman" size=2>&nbsp;</font></p>
<h3><strong><font face="Times New Roman" size=5><span><span>2.2.2.<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp; </span></font></span></span></font></strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=宋体><span>决策的分割点无序</span></font></h3>
<p><strong><font face=宋体 size=2><span><span>共性总结</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>无序性</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>每次决策的点的编号是无序的，即要按决策的递归顺序输出分割点的编号的话，编号是无序的。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>方程一般形式</span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>f(i,j)=optimize{f(i,k-1)+f(k+1,j)}+w(i,j)</span></span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>(i,j)</span></span></font><font face=宋体><span>表示从</span></font><span>i</span><font face=宋体><span>到</span></font><span>j</span><font face=宋体><span>的范围内选取一个分割点</span></font><span>k</span><font face=宋体><span>的最优值，子问题是分割点左边</span></font><span>(i,k-1)</span><font face=宋体><span>和右边</span></font><span>(k+1,j)</span><font face=宋体><span>的点的范围的最优值；这里</span></font><span>optimize</span><font face=宋体><span>可以为</span></font><span>max,min</span><font face=宋体><span>。</span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>方程很类似</span></font><span>2</span><font face=宋体><span>叉树的性质。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>c)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>四边形不等式</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>此类的问题，有些可用四边形不等式优化。见优化章。</span></span></font></p>
<p><strong><font face=宋体 size=2><span><span>题库</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>石子合并</span></font><span>(NOI95 2)<strong></strong></span></p>
<p><font face=宋体 size=2><span><span>经典，详见报告。</span></span></font></p>
<p><font face=宋体 size=2><span><span>可用<span>四边形不等式优化成</span></span></span></font><span>O(n<sup>2</sup>)</span></p>
<p><font face=宋体 size=2><span><span>其实还可以用类似堆的数据结构在</span></span></font><span>O(nlogn)</span><font face=宋体><span>的时间内完成，但这就不是动态规划了。</span></font></p>
<p><font face=宋体 size=2><span><span>应用：</span></span></font></p>
<p><font face=宋体 color=#3366ff size=2><span><span>构造最优二叉排序树</span></span></font><span>(CTSC96 2)</span></p>
<p><font face="Times New Roman" size=2>&nbsp;</font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>多边形</span></font><span>(IOI98)</span></p>
<p><font face=宋体 size=2><span><span>这题值的正负号处理要注意，乘法运算，由于符号的加入，使原本的正的最优解，一下变成负的。</span></span></font><font color=#3366ff></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>c)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>加分二叉树</span></font><span>(NOIP03 Advance 3)</span></p>
<p><font face=宋体 size=2><span><span>方程就是一般式，转移的函数：</span></span></font><span>w(i,j)=sum(i,k-1)*sum(k+1,j)+d(k)</span><font face=宋体><span>。由于</span></font><span>w(i,j)</span><font face=宋体><span>不满足凸单调性，所以不能用<span>四边形不等式优化。</span></span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>d)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>括号序列</span></font><span>(Problem B, NEERC 2001)<font color=#3366ff></font></span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>这题的分割点不是一个元素，而是元素间的一条线。</span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>主要的思维方式是从递归定义。</span></font></p>
<h2><strong><font face=Arial size=5><span><span>2.3.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>路径问题</span></font></h2>
<p><strong><font face=宋体 size=2><span><span>共性总结</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>行走方向决定阶段性</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>有规定源点与终点。每次行走方向都有一定的规定，使原点到终点的所有路径形成无环有向图。</span></span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>多源或多汇</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>当多源或多汇时，应该加维，使得每个源，都有一个路径的状态与之对应。如有</span></span></font><span>n</span><font face=宋体><span>个源的网格类问题，常常转态是</span></font><span>(x1,y1)(x2,y2)&#8230;(xn,yn)</span><font face=宋体><span>。但是源太多的话，空间上不允许，可以降问题转成网络流问题。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>c)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>双向动态规划</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>由于有规定源点与终点，可以双向动态规划，但要考虑效果好不好，理论上是比原来少</span></span></font><span>1/2</span><font face=宋体><span>，但有时由于可用于决策的状态较少，效果就不错了。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>d)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>决策稀疏性</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>就是所谓走法，若对于一个状态，它的前驱或者后继数很少</span></span></font><span>(</span><font face=宋体><span>从无环有向图角度，就是入度或出度少</span></font><span>)</span><font face=宋体><span>，称决策稀疏。</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>e)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>状态稀疏性</span></font><font color=#3366ff></font></p>
<p><font face=宋体 size=2><span><span>就是很多状态是没有用的，如<strong><span>排列的</span></strong></span></span></font><strong><span>LCS</span></strong><span>,</span><font face=宋体><span>状态为</span></font><span>2</span><font face=宋体><span>维的</span></font><span>(x,y)</span><font face=宋体><span>，但对于一个</span></font><span>x</span><font face=宋体><span>只有一个</span></font><span>y</span><font face=宋体><span>是有效个。所以实质上状态数还是线形的。</span></font></p>
<p><font face=宋体 size=2><span><span>本类一些技巧性的东西较多，在题库中具体说明。</span></span></font></p>
<p><strong><font face=宋体 size=2><span><span>题库</span></span></font></strong></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>a)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>方格取数</span></font><span>(NOIP00 advance 4)</span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>(x1,y1)(x2,y2)</span></span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>对角线空间优化</span></font></p>
<p><font face="Times New Roman" color=#3366ff size=2><span><span>b)<font face="Times New Roman" size=1><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><font face=宋体 color=#3366ff><span>花店橱窗布置</span></font><span>(IOI99)</span></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font></p>
<p><font face="Times New Roman" size=2><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font><font face=宋体><span>我对本题有个小改造：若花瓶无序，如何做，有序指：对于花束</span></font><span>i&lt;</span><font face=宋体><span>花束</span></font><span>j, </span><font face=宋体><span>花束</span></font><span>i</span><font face=宋体><span>对应的花瓶编号</span></font><span>&lt;</span><font face=宋体><span>花束</span></font><span>j</span><font face=宋体><span>对应的花瓶编号。那么这样就是一个</span></font><span>NP</span><font face=宋体><span>问题了，可用后面的基于状态压缩的动态规划解决。</span></font></p>
<p><font face="Times New Roman" size=2>&nbsp;</font></p>
<h1><strong><font face="Times New Roman" size=6><span><span>3.<font face="Times New Roman" size=1><span>&nbsp;&nbsp; </span></font></span></span></font></strong><font face=宋体><span>动态规划的优化</span></font></h1>
<h2><strong><font face=Arial size=5><span><span>3.1.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>迭代</span></font></h2>
<h2><strong><font face=Arial size=5><span><span>3.2.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>四边形</span></font></h2>
<h2><strong><font face=Arial size=5><span><span>3.3.<font face="Times New Roman" size=1><span> </span></font></span></span></font></strong><font face=黑体><span>凸性的优化</span></font></h2>
<p><strong><font face="Times New Roman" size=2>&nbsp;</font></strong></p>
<p><strong><font face="Times New Roman" size=2><span><span><span>&nbsp;&nbsp;&nbsp; </span></span></span></font></strong><strong><font face=宋体><span>最主要的未总结，给出相关的题与已有的报告（自己或他人的）</span></font></strong></p>
<img src ="http://www.cppblog.com/cdy20/aggbug/76889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cdy20/" target="_blank">cdy20</a> 2009-03-17 18:36 <a href="http://www.cppblog.com/cdy20/archive/2009/03/17/76889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dp 笔记1</title><link>http://www.cppblog.com/cdy20/archive/2009/03/15/76662.html</link><dc:creator>cdy20</dc:creator><author>cdy20</author><pubDate>Sun, 15 Mar 2009 10:48:00 GMT</pubDate><guid>http://www.cppblog.com/cdy20/archive/2009/03/15/76662.html</guid><wfw:comment>http://www.cppblog.com/cdy20/comments/76662.html</wfw:comment><comments>http://www.cppblog.com/cdy20/archive/2009/03/15/76662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cdy20/comments/commentRss/76662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cdy20/services/trackbacks/76662.html</trackback:ping><description><![CDATA[<p>pku 1664 整数拆分<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; &nbsp;F[i,j,k] = ∑ F[i-1,j-k,t]&nbsp; (t&lt;=k&lt;=j) <br>&nbsp; &nbsp; 初始 F[0,0,0] = 1<br>&nbsp;&nbsp;&nbsp;&nbsp; F[i,j,k]表示把j拆分成i个数，最大的数为k的方案数。<br>&nbsp; &nbsp; 自然，题目询问的拆分方案数就是：<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; Ans[m,n] =&nbsp; ∑ F[m,n,i] &nbsp; (0&lt;=i&lt;=n)<br></p>
<img src ="http://www.cppblog.com/cdy20/aggbug/76662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cdy20/" target="_blank">cdy20</a> 2009-03-15 18:48 <a href="http://www.cppblog.com/cdy20/archive/2009/03/15/76662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>