﻿<?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++博客-y @ The Angry Teletubbies-文章分类-DP</title><link>http://www.cppblog.com/y346491470/category/17541.html</link><description>为梦想而奋斗！</description><language>zh-cn</language><lastBuildDate>Wed, 25 Jul 2012 21:21:17 GMT</lastBuildDate><pubDate>Wed, 25 Jul 2012 21:21:17 GMT</pubDate><ttl>60</ttl><item><title>hdoj 4050 wolf5x - 期望 + dp</title><link>http://www.cppblog.com/y346491470/articles/185087.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Wed, 25 Jul 2012 15:46:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/185087.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/185087.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/185087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/185087.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/185087.html</trackback:ping><description><![CDATA[【题意】：<span>跳格子，左右脚轮流跳，不能往回跳，每次跳有个[A , B]步长范围。</span>每个格子可能出现四种状态，可右脚进，左脚进，双脚进，不准进。每种状态都有一定概率。每次只能跳到最近可行的格子。当跳出了n个格子或者不能动时期望步数。<br /><br />【题解】：期望类题目，无环，直接dp。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 利用全期望公式，注意状态枚举时要乘上条件概率。然后按常规期望做法即可，倒着推。答案为dp[0][3]。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;"set"<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;"utility"<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">15</span>&nbsp;typedef&nbsp;pair&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;pii;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;sof(x)&nbsp;sizeof(x)<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;dp[4010][4];<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;p[4010][4];<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;a,&nbsp;b;<br /><span style="color: #008080; ">29</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;T;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;T);<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d",&nbsp;&amp;n,&nbsp;&amp;a,&nbsp;&amp;b);<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(p,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(p));<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(dp,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(dp));<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf%lf%lf",&nbsp;&amp;p[i][0],&nbsp;&amp;p[i][1],&nbsp;&amp;p[i][2],&nbsp;&amp;p[i][3]);<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;n&nbsp;+&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n&nbsp;+&nbsp;a;&nbsp;i++)&nbsp;p[i][3]&nbsp;=&nbsp;1.0;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;c&nbsp;=&nbsp;1.0;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;n;&nbsp;i&nbsp;&gt;=&nbsp;0;&nbsp;i--)&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;&nbsp;4;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;pp&nbsp;=&nbsp;1.0;<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;a;&nbsp;k&nbsp;&lt;=&nbsp;b;&nbsp;k++)&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(j&nbsp;==&nbsp;1)&nbsp;{<br /><span style="color: #008080; ">45</span>&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;dp[i][1]&nbsp;+=&nbsp;pp&nbsp;*&nbsp;((dp[i+k][2]&nbsp;+&nbsp;c)&nbsp;*&nbsp;p[i+k][2]&nbsp;+&nbsp;(dp[i+k][3]&nbsp;+&nbsp;c)&nbsp;*&nbsp;p[i+k][3]);<br /><span style="color: #008080; ">46</span>&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;pp&nbsp;*=&nbsp;(p[i+k][0]&nbsp;+&nbsp;p[i+k][1]);<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>(j&nbsp;==&nbsp;2)&nbsp;{<br /><span style="color: #008080; ">48</span>&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;dp[i][2]&nbsp;+=&nbsp;pp&nbsp;*&nbsp;((dp[i+k][1]&nbsp;+&nbsp;c)&nbsp;*&nbsp;p[i+k][1]&nbsp;+&nbsp;(dp[i+k][3]&nbsp;+&nbsp;c)&nbsp;*&nbsp;p[i+k][3]);<br /><span style="color: #008080; ">49</span>&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;pp&nbsp;*=&nbsp;(p[i+k][0]&nbsp;+&nbsp;p[i+k][2]);<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>(j&nbsp;==&nbsp;3)&nbsp;{<br /><span style="color: #008080; ">51</span>&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;dp[i][3]&nbsp;+=&nbsp;pp&nbsp;*&nbsp;((dp[i+k][1]&nbsp;+&nbsp;c)&nbsp;*&nbsp;p[i+k][1]&nbsp;+&nbsp;(dp[i+k][2]&nbsp;+&nbsp;c)&nbsp;*&nbsp;p[i+k][2]&nbsp;+&nbsp;(dp[i+k][3]&nbsp;+&nbsp;c)&nbsp;*&nbsp;p[i+k][3]);<br /><span style="color: #008080; ">52</span>&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;pp&nbsp;*=&nbsp;(p[i+k][0]);<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%.6f\n",&nbsp;dp[0][3]);<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">60</span>&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/185087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-07-25 23:46 <a href="http://www.cppblog.com/y346491470/articles/185087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 4219 Randomization - 树dp + 概率</title><link>http://www.cppblog.com/y346491470/articles/184744.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Mon, 23 Jul 2012 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/184744.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/184744.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/184744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/184744.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/184744.html</trackback:ping><description><![CDATA[【题意】：<span>给定一棵树，给定边权的区间[0,L]，求最终树的最长路&lt;=S的概率；</span>&nbsp;<br /><br />【题解】：武大校赛的树dp，放了好久，看着题解勉强过了。只可以说我的树dp太水了，还停留在背包的阶段。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设状态dp[i][j]表示以i为根的子树，其叶子结点到i的最长距离为j且该子树最长路径不超过s的概率。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对于u的一个子树v，先枚举u连v的长度，然后再把之前的子树和v这条链合并，好复杂，不会表达了，直接研究代码吧。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;70<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxs&nbsp;530<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;l,&nbsp;s;<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;dp[maxn][maxs];<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;son[maxs],&nbsp;tmp[maxs];<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;e;<br /><span style="color: #008080; ">27</span>&nbsp;vector&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;vec[maxn];<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fa)&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(dp[u],&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(dp[u]));<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][0]&nbsp;=&nbsp;1.0;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;vec[u].size();<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;vec[u][i];<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v,&nbsp;u);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(son,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(son));<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(tmp,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(tmp));<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;=&nbsp;l;&nbsp;j++)<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;=&nbsp;s;&nbsp;k++)<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(j&nbsp;+&nbsp;k&nbsp;&lt;=&nbsp;s)<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;son[j+k]&nbsp;+=&nbsp;e&nbsp;*&nbsp;dp[v][k];<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;=&nbsp;s;&nbsp;j++)<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;=&nbsp;s&nbsp;-&nbsp;j;&nbsp;k++)<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp[max(j,&nbsp;k)]&nbsp;+=&nbsp;son[j]&nbsp;*&nbsp;dp[u][k];<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;=&nbsp;s;&nbsp;j++)<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j]&nbsp;=&nbsp;tmp[j];<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">48</span>&nbsp;}<br /><span style="color: #008080; ">49</span>&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;T,&nbsp;Case&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;T);<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d",&nbsp;&amp;n,&nbsp;&amp;l,&nbsp;&amp;s);<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;vec[i].clear();<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;1.0&nbsp;/&nbsp;(1.0&nbsp;+&nbsp;l);<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a,&nbsp;b;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;a,&nbsp;&amp;b);<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[a].pb(b);<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[b].pb(a);<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(1,&nbsp;-1);<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;ans&nbsp;=&nbsp;0.0;<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;=&nbsp;s;&nbsp;i++)&nbsp;ans&nbsp;+=&nbsp;dp[1][i];<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Case&nbsp;%d:&nbsp;%.6f\n",&nbsp;Case++,&nbsp;ans);<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">69</span>&nbsp;}<br /><span style="color: #008080; ">70</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/184744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-07-23 16:23 <a href="http://www.cppblog.com/y346491470/articles/184744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 4301 Divide Chocolate - dp + 延长分割线</title><link>http://www.cppblog.com/y346491470/articles/184319.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Fri, 20 Jul 2012 04:00:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/184319.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/184319.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/184319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/184319.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/184319.html</trackback:ping><description><![CDATA[【题意】：给一块n*2的巧克力，问分成k块的方案数有多少种。<br /><br />【题解】：多校联赛第一场的b，想了2个小时，途中出现MLE,TLE，最后还是AC了。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设状态dp[i][j][0-7]表示处理完第i列已经分成j块且第i列的分割线状态为0-7的方案数。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0：空 1：&#9472; &nbsp;2：&#9488; 3：&#9496; 4：&#9474; 5：&#9508; 6：<sub>| </sub>7：<sup>|</sup>&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 转移即是延长或终止上一列的分割线或加入新的分割线，具体看代码。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;"set"<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;"utility"<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">15</span>&nbsp;typedef&nbsp;pair&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;pii;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;sof(x)&nbsp;sizeof(x)<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;MOD&nbsp;=&nbsp;100000007;<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[2][2010][10];<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans[1010][2010];<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m;<br /><span style="color: #008080; ">29</span>&nbsp;<br /><span style="color: #008080; ">30</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(dp,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(dp));<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[0][0][4]&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;p3&nbsp;=&nbsp;0,&nbsp;p2&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;1000;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(p3,&nbsp;p2);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;=&nbsp;(i&nbsp;&lt;&lt;&nbsp;1);&nbsp;j++)<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;8;&nbsp;k++)<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[p3][j][k]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;=&nbsp;(i&nbsp;&lt;&lt;&nbsp;1);&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[p3][j][0]&nbsp;=&nbsp;(dp[p2][j][0]&nbsp;+&nbsp;dp[p2][j][2]&nbsp;+&nbsp;dp[p2][j][3]&nbsp;+&nbsp;dp[p2][j][4]&nbsp;+&nbsp;dp[p2][j][5])&nbsp;%&nbsp;MOD;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[p3][j][1]&nbsp;=&nbsp;(dp[p2][j][1]&nbsp;+&nbsp;dp[p2][j][2]&nbsp;+&nbsp;dp[p2][j][3]&nbsp;+&nbsp;dp[p2][j][4]&nbsp;+&nbsp;dp[p2][j][5]&nbsp;+&nbsp;dp[p2][j][6]&nbsp;+&nbsp;dp[p2][j][7])&nbsp;%&nbsp;MOD;<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[p3][j][6]&nbsp;=&nbsp;dp[p3][j][7]&nbsp;=&nbsp;(dp[p2][j][0]&nbsp;+&nbsp;dp[p2][j][2]&nbsp;+&nbsp;dp[p2][j][3]&nbsp;+&nbsp;dp[p2][j][4]&nbsp;+&nbsp;dp[p2][j][5])&nbsp;%&nbsp;MOD;<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[p3][j][7]&nbsp;=&nbsp;(dp[p2][j][0]&nbsp;+&nbsp;dp[p2][j][2]&nbsp;+&nbsp;dp[p2][j][3]&nbsp;+&nbsp;dp[p2][j][4]&nbsp;+&nbsp;dp[p2][j][5])&nbsp;%&nbsp;MOD;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(j&nbsp;&gt;=&nbsp;1)&nbsp;{<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[p3][j][3]&nbsp;=&nbsp;dp[p3][j][2]&nbsp;=&nbsp;(dp[p2][j-1][1]&nbsp;+&nbsp;dp[p2][j-1][2]&nbsp;+&nbsp;dp[p2][j-1][3]&nbsp;+&nbsp;dp[p2][j-1][4]&nbsp;+&nbsp;dp[p2][j-1][5]&nbsp;+&nbsp;dp[p2][j-1][6]&nbsp;+&nbsp;dp[p2][j-1][7])&nbsp;%&nbsp;MOD;<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[p3][j][3]&nbsp;=&nbsp;(dp[p2][j-1][1]&nbsp;+&nbsp;dp[p2][j-1][2]&nbsp;+&nbsp;dp[p2][j-1][3]&nbsp;+&nbsp;dp[p2][j-1][4]&nbsp;+&nbsp;dp[p2][j-1][5]&nbsp;+&nbsp;dp[p2][j-1][6]&nbsp;+&nbsp;dp[p2][j-1][7])&nbsp;%&nbsp;MOD;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[p3][j][4]&nbsp;=&nbsp;(dp[p2][j-1][0]&nbsp;+&nbsp;dp[p2][j-1][2]&nbsp;+&nbsp;dp[p2][j-1][3]&nbsp;+&nbsp;dp[p2][j-1][4]&nbsp;+&nbsp;dp[p2][j-1][5])&nbsp;%&nbsp;MOD;<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(j&nbsp;&gt;=&nbsp;2)&nbsp;dp[p3][j][5]&nbsp;=&nbsp;(dp[p2][j-2][1]&nbsp;+&nbsp;dp[p2][j-2][2]&nbsp;+&nbsp;dp[p2][j-2][3]&nbsp;+&nbsp;dp[p2][j-2][4]&nbsp;+&nbsp;dp[p2][j-2][5]&nbsp;+&nbsp;dp[p2][j-2][6]&nbsp;+&nbsp;dp[p2][j-2][7])&nbsp;%&nbsp;MOD;<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans[i][j]&nbsp;=&nbsp;(dp[p3][j][4]&nbsp;+&nbsp;dp[p3][j][5])&nbsp;%&nbsp;MOD;<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">53</span>&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;<br /><span style="color: #008080; ">55</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;T;<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;T);<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;n,&nbsp;&amp;m);<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;ans[n][m]);<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">64</span>&nbsp;}<br /><span style="color: #008080; ">65</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/184319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-07-20 12:00 <a href="http://www.cppblog.com/y346491470/articles/184319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 3311 Dig The Wells - 斯坦纳树 + 两次dp</title><link>http://www.cppblog.com/y346491470/articles/184064.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Wed, 18 Jul 2012 07:19:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/184064.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/184064.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/184064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/184064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/184064.html</trackback:ping><description><![CDATA[【题意】：给定n(n&lt;=5)个必选点，和m(m&lt;=1000)个辅助点，每个点都有权值表示在这个点挖井的费用。还有p条边，每条边都有费用。问使得1-n个点都有水喝的最小费用是多少。<br /><br />【题解】：显然最后求出来的解可能是一个森林。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设状态dp[i][j]表示在 i 挖井且连通了 j 这些点的最小费用。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;状态minn[i]表示 i 这些点都有水喝的最小费用。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我的思路是用斯坦纳树求出所有dp[i][j]的值，然后再dp一次，求出minn[i]的值。ans = min[(1&lt;&lt;n)-1];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 看到还有一种解法，就是加入一个虚拟结点，然后每个点都向虚拟结点连边，费用是每个结点挖井的费用。这样处理后就没有点权只有边权了，而且1-n号点最后一定是连通的，然后求一次斯坦纳树就可以了。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp; 1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">&nbsp;10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">&nbsp;11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">&nbsp;12</span>&nbsp;#include&nbsp;"set"<br /><span style="color: #008080; ">&nbsp;13</span>&nbsp;#include&nbsp;"utility"<br /><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">&nbsp;15</span>&nbsp;typedef&nbsp;pair&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;pii;<br /><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;sof(x)&nbsp;sizeof(x)<br /><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;1050<br /><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;29;<br /><span style="color: #008080; ">&nbsp;27</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Edge&nbsp;{<br /><span style="color: #008080; ">&nbsp;28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v,&nbsp;w;<br /><span style="color: #008080; ">&nbsp;29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edge(){}<br /><span style="color: #008080; ">&nbsp;30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edge(<span style="color: #0000FF; ">int</span>&nbsp;_v,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;_w)&nbsp;{<br /><span style="color: #008080; ">&nbsp;31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;=&nbsp;_v,&nbsp;w&nbsp;=&nbsp;_w;<br /><span style="color: #008080; ">&nbsp;32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;33</span>&nbsp;};<br /><span style="color: #008080; ">&nbsp;34</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m,&nbsp;p;<br /><span style="color: #008080; ">&nbsp;35</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[maxn][1&lt;&lt;5],&nbsp;minn[1&lt;&lt;5];<br /><span style="color: #008080; ">&nbsp;36</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;val[maxn],&nbsp;hash[maxn];<br /><span style="color: #008080; ">&nbsp;37</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;visit[maxn][1&lt;&lt;5];<br /><span style="color: #008080; ">&nbsp;38</span>&nbsp;vector&lt;Edge&gt;&nbsp;vec[maxn];<br /><span style="color: #008080; ">&nbsp;39</span>&nbsp;queue&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;que;<br /><span style="color: #008080; ">&nbsp;40</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;update(<span style="color: #0000FF; ">int</span>&nbsp;cost,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nst)&nbsp;{<br /><span style="color: #008080; ">&nbsp;41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(cost&nbsp;&lt;&nbsp;dp[v][nst])&nbsp;{<br /><span style="color: #008080; ">&nbsp;42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[v][nst]&nbsp;=&nbsp;cost;<br /><span style="color: #008080; ">&nbsp;43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!visit[v][nst])&nbsp;{<br /><span style="color: #008080; ">&nbsp;44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.push(v&nbsp;+&nbsp;(nst&nbsp;&lt;&lt;&nbsp;10));<br /><span style="color: #008080; ">&nbsp;45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[v][nst]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">&nbsp;46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;48</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;49</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;50</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;solve()&nbsp;{<br /><span style="color: #008080; ">&nbsp;51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(!que.empty())&nbsp;que.pop();<br /><span style="color: #008080; ">&nbsp;52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(hash,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(hash));<br /><span style="color: #008080; ">&nbsp;53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(visit,&nbsp;<span style="color: #0000FF; ">false</span>,&nbsp;<span style="color: #0000FF; ">sizeof</span>(visit));<br /><span style="color: #008080; ">&nbsp;54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nn&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;n;<br /><span style="color: #008080; ">&nbsp;55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;=&nbsp;n&nbsp;+&nbsp;m;&nbsp;i++)<br /><span style="color: #008080; ">&nbsp;56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nn;&nbsp;j++)<br /><span style="color: #008080; ">&nbsp;57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][j]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">&nbsp;58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash[i]&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;(i&nbsp;-&nbsp;1);<br /><span style="color: #008080; ">&nbsp;60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update(val[i],&nbsp;i,&nbsp;hash[i]);<br /><span style="color: #008080; ">&nbsp;61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(!que.empty())&nbsp;{<br /><span style="color: #008080; ">&nbsp;63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;now&nbsp;=&nbsp;que.front();<br /><span style="color: #008080; ">&nbsp;64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.pop();<br /><span style="color: #008080; ">&nbsp;65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u&nbsp;=&nbsp;now&nbsp;%&nbsp;(1&nbsp;&lt;&lt;&nbsp;10),&nbsp;st&nbsp;=&nbsp;now&nbsp;&gt;&gt;&nbsp;10;<br /><span style="color: #008080; ">&nbsp;66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[u][st]&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">&nbsp;67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;vec[u].size();<br /><span style="color: #008080; ">&nbsp;68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;vec[u][i].v,&nbsp;w&nbsp;=&nbsp;vec[u][i].w;<br /><span style="color: #008080; ">&nbsp;70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update(dp[u][st]&nbsp;+&nbsp;w&nbsp;-&nbsp;val[u]&nbsp;+&nbsp;val[v],&nbsp;v,&nbsp;st&nbsp;|&nbsp;hash[v]);<br /><span style="color: #008080; ">&nbsp;71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;t&nbsp;=&nbsp;nn&nbsp;-&nbsp;1&nbsp;-&nbsp;st;<br /><span style="color: #008080; ">&nbsp;73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;t;&nbsp;i;&nbsp;i&nbsp;=&nbsp;(i&nbsp;-&nbsp;1)&nbsp;&amp;&nbsp;t)&nbsp;{<br /><span style="color: #008080; ">&nbsp;74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update(dp[u][st]&nbsp;+&nbsp;dp[u][i|hash[u]]&nbsp;-&nbsp;val[u],&nbsp;u,&nbsp;st&nbsp;|&nbsp;i);<br /><span style="color: #008080; ">&nbsp;75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nn;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minn[i]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">&nbsp;79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;=&nbsp;n&nbsp;+&nbsp;m;&nbsp;j++)<br /><span style="color: #008080; ">&nbsp;80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minn[i]&nbsp;=&nbsp;min(minn[i],&nbsp;dp[j][i]);<br /><span style="color: #008080; ">&nbsp;81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nn;&nbsp;i++)<br /><span style="color: #008080; ">&nbsp;83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i;&nbsp;j;&nbsp;j&nbsp;=&nbsp;(j&nbsp;-&nbsp;1)&nbsp;&amp;&nbsp;i)<br /><span style="color: #008080; ">&nbsp;84</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minn[i]&nbsp;=&nbsp;min(minn[i],&nbsp;minn[i-j]&nbsp;+&nbsp;minn[j]);<br /><span style="color: #008080; ">&nbsp;85</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;minn[nn-1]);<br /><span style="color: #008080; ">&nbsp;86</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;87</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;88</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">&nbsp;89</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d%d",&nbsp;&amp;n,&nbsp;&amp;m,&nbsp;&amp;p))&nbsp;{<br /><span style="color: #008080; ">&nbsp;90</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;maxn;&nbsp;i++)&nbsp;vec[i].clear();<br /><span style="color: #008080; ">&nbsp;91</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n&nbsp;+&nbsp;m;&nbsp;i++)&nbsp;scanf("%d",&nbsp;&amp;val[i]);<br /><span style="color: #008080; ">&nbsp;92</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;p;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;93</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;w;<br /><span style="color: #008080; ">&nbsp;94</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d",&nbsp;&amp;u,&nbsp;&amp;v,&nbsp;&amp;w);<br /><span style="color: #008080; ">&nbsp;95</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[u].pb(Edge(v,&nbsp;w));<br /><span style="color: #008080; ">&nbsp;96</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[v].pb(Edge(u,&nbsp;w));<br /><span style="color: #008080; ">&nbsp;97</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;98</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br /><span style="color: #008080; ">&nbsp;99</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">100</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">101</span>&nbsp;}<br /><span style="color: #008080; ">102</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/184064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-07-18 15:19 <a href="http://www.cppblog.com/y346491470/articles/184064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 1185 炮兵阵地 - 状态压缩dp + 预处理</title><link>http://www.cppblog.com/y346491470/articles/177187.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sat, 02 Jun 2012 04:48:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/177187.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/177187.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/177187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/177187.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/177187.html</trackback:ping><description><![CDATA[【题意】：<span>司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成，地图的每一格可能是山地（用"H" 表示），也可能是平原（用"P"表示），如下图。在每一格平原地形上最多可以布置一支炮兵部队（山地上不能够部署炮兵部队）；一支炮兵部队在地图上的攻击范围如图中黑色区域所示：&nbsp;</span><br /><center><img src="http://poj.org/images/1185_1.jpg" alt="" /></center><br /><span>如果在地图中的灰色所标识的平原上部署一支炮兵部队，则图中的黑色的网格表示它能够攻击到的区域：沿横向左右各两格，沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。&nbsp;</span><br /><span>现在，将军们规划如何部署炮兵部队，在防止误伤的前提下（保证任何两支炮兵部队之间不能互相攻击，即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内），在整个地图区域内最多能够摆放多少我军的炮兵部队。&nbsp;</span>&nbsp;<br /><br />【题解】：经典的状态压缩dp。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 因为每行最多只有10个格子，考虑使用状态压缩。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 无效的状态有很多，需要先预处理出所有合法状态，最多只有60种，存放在st[]。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设dp[i][j][k]表示当前第i行的状态为st[j]且第i-1行的状态为st[k]能够摆放部队的最大值。<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 转移方程：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dp[i][j][k] = max(cnt[j] + dp[i-1][k][kk])<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 最后的ans = max(dp[n-1][i][j]).<br /><br />【代码】：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp; 1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">&nbsp;10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">&nbsp;11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">&nbsp;12</span>&nbsp;#include&nbsp;"set"<br /><span style="color: #008080; ">&nbsp;13</span>&nbsp;#include&nbsp;"utility"<br /><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">&nbsp;15</span>&nbsp;typedef&nbsp;pair&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;pii;<br /><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;sof(x)&nbsp;sizeof(x)<br /><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;25;<br /><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m;<br /><span style="color: #008080; ">&nbsp;27</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;maz[110][15];<br /><span style="color: #008080; ">&nbsp;28</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;row[110];<br /><span style="color: #008080; ">&nbsp;29</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[110][70][70];<br /><span style="color: #008080; ">&nbsp;30</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;st[70],&nbsp;tot,&nbsp;cnt[70];<br /><span style="color: #008080; ">&nbsp;31</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;32</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br /><span style="color: #008080; ">&nbsp;33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tot&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(cnt,&nbsp;0,&nbsp;sof(cnt));<br /><span style="color: #008080; ">&nbsp;35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nn&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;m;<br /><span style="color: #008080; ">&nbsp;36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nn;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;flag&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">&nbsp;38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;tmp&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;m&nbsp;-&nbsp;1;&nbsp;j&nbsp;&gt;=&nbsp;0;&nbsp;j--)&nbsp;{<br /><span style="color: #008080; ">&nbsp;40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(i&nbsp;&amp;&nbsp;(1&nbsp;&lt;&lt;&nbsp;j))&nbsp;{<br /><span style="color: #008080; ">&nbsp;41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp++;<br /><span style="color: #008080; ">&nbsp;42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>((j&nbsp;&gt;=&nbsp;1)&nbsp;&amp;&amp;&nbsp;(i&nbsp;&amp;&nbsp;(1&nbsp;&lt;&lt;&nbsp;(j-1))))&nbsp;{<br /><span style="color: #008080; ">&nbsp;43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">&nbsp;44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">&nbsp;45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>((j&nbsp;&gt;=&nbsp;2)&nbsp;&amp;&amp;&nbsp;(i&nbsp;&amp;&nbsp;(1&nbsp;&lt;&lt;&nbsp;(j-2))))&nbsp;{<br /><span style="color: #008080; ">&nbsp;47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">&nbsp;48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">&nbsp;49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(flag)&nbsp;{<br /><span style="color: #008080; ">&nbsp;53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st[tot]&nbsp;=&nbsp;i,&nbsp;cnt[tot++]&nbsp;=&nbsp;tmp;<br /><span style="color: #008080; ">&nbsp;54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><span style="color: #008080; ">&nbsp;56</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;57</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;58</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;solve()&nbsp;{<br /><span style="color: #008080; ">&nbsp;59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br /><span style="color: #008080; ">&nbsp;60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)<br /><span style="color: #008080; ">&nbsp;61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;tot;&nbsp;j++)<br /><span style="color: #008080; ">&nbsp;62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;tot;&nbsp;k++)<br /><span style="color: #008080; ">&nbsp;63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][j][k]&nbsp;=&nbsp;-inf;<br /><span style="color: #008080; ">&nbsp;64</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;tot;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!(st[i]&nbsp;&amp;&nbsp;row[0]))&nbsp;dp[0][i][0]&nbsp;=&nbsp;cnt[i];<br /><span style="color: #008080; ">&nbsp;67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;dp[0][i][0]&nbsp;=&nbsp;-inf;<br /><span style="color: #008080; ">&nbsp;68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;&nbsp;tot;&nbsp;j++)&nbsp;dp[0][i][j]&nbsp;=&nbsp;-inf;<br /><span style="color: #008080; ">&nbsp;69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;70</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)<br /><span style="color: #008080; ">&nbsp;72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;tot;&nbsp;j++)<br /><span style="color: #008080; ">&nbsp;73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!(row[i]&nbsp;&amp;&nbsp;st[j]))&nbsp;<br /><span style="color: #008080; ">&nbsp;74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;tot;&nbsp;k++)<br /><span style="color: #008080; ">&nbsp;75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!(st[j]&nbsp;&amp;&nbsp;st[k]))<br /><span style="color: #008080; ">&nbsp;76</span>&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 style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;kk&nbsp;=&nbsp;0;&nbsp;kk&nbsp;&lt;&nbsp;tot;&nbsp;kk++)<br /><span style="color: #008080; ">&nbsp;77</span>&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;<span style="color: #0000FF; ">if</span>(!(st[j]&nbsp;&amp;&nbsp;st[kk]))<br /><span style="color: #008080; ">&nbsp;78</span>&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;dp[i][j][k]&nbsp;=&nbsp;max(dp[i][j][k],&nbsp;cnt[j]&nbsp;+&nbsp;dp[i-1][k][kk]);<br /><span style="color: #008080; ">&nbsp;79</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;tot;&nbsp;i++)<br /><span style="color: #008080; ">&nbsp;82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;tot;&nbsp;j++)<br /><span style="color: #008080; ">&nbsp;83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;=&nbsp;max(ans,&nbsp;dp[n-1][i][j]);<br /><span style="color: #008080; ">&nbsp;84</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;ans);<br /><span style="color: #008080; ">&nbsp;85</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;86</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;87</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">&nbsp;88</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d",&nbsp;&amp;n,&nbsp;&amp;m))&nbsp;{<br /><span style="color: #008080; ">&nbsp;89</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(row,&nbsp;0,&nbsp;sof(row));<br /><span style="color: #008080; ">&nbsp;90</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;91</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%s",&nbsp;maz[i]);<br /><span style="color: #008080; ">&nbsp;92</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;m&nbsp;-&nbsp;1;&nbsp;j&nbsp;&gt;=&nbsp;0;&nbsp;j--)&nbsp;{<br /><span style="color: #008080; ">&nbsp;93</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row[i]&nbsp;&lt;&lt;=&nbsp;1;<br /><span style="color: #008080; ">&nbsp;94</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(maz[i][j]&nbsp;==&nbsp;'H')&nbsp;row[i]&nbsp;|=&nbsp;1;<br /><span style="color: #008080; ">&nbsp;95</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;96</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;97</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br /><span style="color: #008080; ">&nbsp;98</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;99</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">100</span>&nbsp;}<br /><span style="color: #008080; ">101</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/177187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-06-02 12:48 <a href="http://www.cppblog.com/y346491470/articles/177187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zoj 3505 Yet Another Set of Numbers - dp + 数位统计 + 逼近</title><link>http://www.cppblog.com/y346491470/articles/175131.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Wed, 16 May 2012 15:49:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/175131.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/175131.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/175131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/175131.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/175131.html</trackback:ping><description><![CDATA[【题意】：略<br /><br />【题解】：<span>比较经典的DP加计数问题模型，可以算这类问题里比较简单的一个例子。只要实现str2id和id2str两个函数就好了。DP只是简单的sum{3^i}，而计数部分，也就是str2id和id2str这两个函数，也和最经典的那种求第k个C(n, m)组合的算法一样。PS: 题目所描述的集合其实是相当于是给一个深度为n的三叉树的每个节点进行遍历标号。</span>&nbsp;<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;"set"<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;"utility"<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">15</span>&nbsp;typedef&nbsp;pair&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;pii;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;sof(x)&nbsp;sizeof(x)<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;25<br /><span style="color: #008080; ">26</span>&nbsp;ll&nbsp;dp[maxn];<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;ll&nbsp;id(<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;c,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*s)&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(*s&nbsp;==&nbsp;0)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ll&nbsp;tmp&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">char</span>&nbsp;i&nbsp;=&nbsp;'0';&nbsp;i&nbsp;&lt;&nbsp;*s;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(i&nbsp;==&nbsp;c)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;+=&nbsp;dp[n-1];<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;+=&nbsp;id(n&nbsp;-&nbsp;1,&nbsp;*s,&nbsp;s&nbsp;+&nbsp;1);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;tmp;<br /><span style="color: #008080; ">37</span>&nbsp;}<br /><span style="color: #008080; ">38</span>&nbsp;<br /><span style="color: #008080; ">39</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;ll&nbsp;k,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;c,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*s)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(k&nbsp;==&nbsp;0)&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*s&nbsp;=&nbsp;'\0';<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k--;<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(*s&nbsp;=&nbsp;'0';&nbsp;;&nbsp;(*s)++)&nbsp;{<span style="color: #008000; ">//</span><span style="color: #008000; ">++*s</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(*s&nbsp;==&nbsp;c)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(k&nbsp;&lt;&nbsp;dp[n-1])&nbsp;{<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(n&nbsp;-&nbsp;1,&nbsp;k,&nbsp;*s,&nbsp;s&nbsp;+&nbsp;1);<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;k&nbsp;-=&nbsp;dp[n-1];<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">52</span>&nbsp;}<br /><span style="color: #008080; ">53</span>&nbsp;<br /><span style="color: #008080; ">54</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ll&nbsp;k;<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;s[maxn];<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[0]&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;maxn;&nbsp;i++)&nbsp;dp[i]&nbsp;=&nbsp;dp[i-1]&nbsp;*&nbsp;3;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;maxn;&nbsp;i++)&nbsp;dp[i]&nbsp;+=&nbsp;dp[i-1];<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%lld%s",&nbsp;&amp;n,&nbsp;&amp;k,&nbsp;s))&nbsp;{<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;=&nbsp;id(n,&nbsp;'0',&nbsp;s)&nbsp;-&nbsp;k;<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(n,&nbsp;k,&nbsp;'0',&nbsp;s);<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts(s);<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">67</span>&nbsp;}<br /><span style="color: #008080; ">68</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/175131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-05-16 23:49 <a href="http://www.cppblog.com/y346491470/articles/175131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UESTC 1649 D hours - dp + 巧妙转换</title><link>http://www.cppblog.com/y346491470/articles/174062.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Wed, 09 May 2012 02:15:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/174062.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/174062.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/174062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/174062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/174062.html</trackback:ping><description><![CDATA[【题解】：<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;"set"<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;"utility"<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">15</span>&nbsp;typedef&nbsp;pair&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;pii;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;sof(x)&nbsp;sizeof(x)<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;MAX&nbsp;110<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;29;<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[MAX][MAX][3];<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sum[MAX][MAX];<br /><span style="color: #008080; ">29</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m;<br /><span style="color: #008080; ">30</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;solve()&nbsp;{<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(dp,&nbsp;0,&nbsp;sof(dp));<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;m;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;1;&nbsp;k&nbsp;&lt;=&nbsp;j;&nbsp;k++)&nbsp;{<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(k&nbsp;&amp;&nbsp;1)&nbsp;{<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][j][1]&nbsp;=&nbsp;max(dp[i][j][1],&nbsp;dp[i-1][j-k][0]&nbsp;+&nbsp;sum[i][k]);<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][j][1]&nbsp;=&nbsp;max(dp[i][j][1],&nbsp;dp[i-1][j-k][1]&nbsp;+&nbsp;sum[i][k]);<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][j][0]&nbsp;=&nbsp;max(dp[i][j][0],&nbsp;dp[i-1][j-k][0]&nbsp;+&nbsp;sum[i][k]);<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][j][2]&nbsp;=&nbsp;max(dp[i][j][2],&nbsp;dp[i-1][j-k][1]&nbsp;+&nbsp;sum[i][k]);<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][j][2]&nbsp;=&nbsp;max(dp[i][j][2],&nbsp;dp[i-1][j-k][2]&nbsp;+&nbsp;sum[i][k]);<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;=&nbsp;max(ans,&nbsp;max(dp[i][m][0],&nbsp;max(dp[i][m][1],&nbsp;dp[i][m][2])));<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;ans&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">49</span>&nbsp;}<br /><span style="color: #008080; ">50</span>&nbsp;<br /><span style="color: #008080; ">51</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;T,&nbsp;Case&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;T;<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a,&nbsp;b;<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;n&nbsp;&gt;&gt;&nbsp;m;<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;a&nbsp;&gt;&gt;&nbsp;b;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;m;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum[i][j]&nbsp;=&nbsp;a&nbsp;*&nbsp;j&nbsp;-&nbsp;j&nbsp;*&nbsp;(j&nbsp;-&nbsp;1)&nbsp;*&nbsp;b&nbsp;/&nbsp;2;<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Case&nbsp;#%d:&nbsp;",&nbsp;Case++);<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">67</span>&nbsp;}<br /><span style="color: #008080; ">68</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/174062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-05-09 10:15 <a href="http://www.cppblog.com/y346491470/articles/174062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zoj 3502 Contest - 状态压缩dp + 期望 + 求最小字典序的方案</title><link>http://www.cppblog.com/y346491470/articles/173825.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sun, 06 May 2012 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/173825.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/173825.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/173825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/173825.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/173825.html</trackback:ping><description><![CDATA[【题意】：略<br /><br />【题解】：最多只有10道题目，很容易想到状态压缩，对于每种状态枚举当前在尝试哪道题目，然后期望的转移比较容易。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;注意本题会卡精度，还要输出最小的字典序方案。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;复杂度是O(2^n*n*n)，用string记录方案很方便。<br /><br />【代码】：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;"set"<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;"utility"<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">15</span>&nbsp;typedef&nbsp;pair&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;pii;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;sof(x)&nbsp;sizeof(x)<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;eps&nbsp;1e-10<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n;<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;p[11][11];<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;dp[1&lt;&lt;11];<br /><span style="color: #008080; ">29</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;s[1&lt;&lt;11];<br /><span style="color: #008080; ">30</span>&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;solve()&nbsp;{<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nn&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;n;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[0]&nbsp;=&nbsp;0.0;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[0]&nbsp;=&nbsp;"";<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;nn;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i]&nbsp;=&nbsp;-1.0;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;n;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(i&nbsp;&amp;&nbsp;(1&nbsp;&lt;&lt;&nbsp;j))&nbsp;{<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;pp&nbsp;=&nbsp;0.0;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;n;&nbsp;k++)&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(i&nbsp;&amp;&nbsp;(1&nbsp;&lt;&lt;&nbsp;k))&nbsp;pp&nbsp;=&nbsp;max(pp,&nbsp;p[k][j]);<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;m&nbsp;=&nbsp;i&nbsp;-&nbsp;(1&nbsp;&lt;&lt;&nbsp;j);<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;tmp&nbsp;=&nbsp;dp[m]&nbsp;+&nbsp;pp;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dp[i]&nbsp;+&nbsp;eps&nbsp;&lt;&nbsp;tmp&nbsp;||&nbsp;(dp[i]&nbsp;-&nbsp;eps&nbsp;&lt;&nbsp;tmp&nbsp;&amp;&amp;&nbsp;s[i]&nbsp;&gt;&nbsp;s[m]))&nbsp;{<span style="color: #008000; ">//</span><span style="color: #008000; ">watashi判精度的方法，妙~</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i]&nbsp;=&nbsp;tmp;<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;ch&nbsp;=&nbsp;j&nbsp;+&nbsp;'A';<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]&nbsp;=&nbsp;s[m]&nbsp;+&nbsp;ch;<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%.2f\n",&nbsp;dp[nn-1]);<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;s[nn-1]&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">55</span>&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;<br /><span style="color: #008080; ">57</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;T;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;T;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;n;<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;n;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;p[i][j];<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[i][j]&nbsp;/=&nbsp;100.0;<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">71</span>&nbsp;}<br /><span style="color: #008080; ">72</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/173825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-05-06 15:37 <a href="http://www.cppblog.com/y346491470/articles/173825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zoj 3506 Cut the Tree - 树dp + 分组背包</title><link>http://www.cppblog.com/y346491470/articles/173737.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sat, 05 May 2012 06:18:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/173737.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/173737.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/173737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/173737.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/173737.html</trackback:ping><description><![CDATA[【题意】：给出一棵树，每个节点有一个权值，要你对这棵树cut k次，每cut一次在两棵树中选择任意一棵继续操作，问cut完k次后，求最后得到的树的最小/最大权值和。<br /><br />【题解】：很明显的树dp。刚开始状态没设好，把问题搞得好复杂。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设状态dp[i][j]表示以i为根的这棵子树cut j次的最小/最大权值和（包括i这个节点）。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;那么对于i的每棵子树都有两种选择，就是保留这棵子树或者丢弃这棵子树。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;这里的转移就是一个简单的背包。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;关键是最后统计答案，如果答案包括根，那么就是dp[root][k]；否则，就需要枚举各个节点的情况，取最优值。<br /><br />【代码】：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;sof(x)&nbsp;sizeof(x)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;1010<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;26;<br /><span style="color: #008080; ">24</span>&nbsp;vector&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;vec[maxn];<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;val[maxn];<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[maxn][25][2];<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;k;<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;cnt[maxn];<br /><span style="color: #008080; ">29</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fa)&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt[u]&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;vec[u].size();<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][0][0]&nbsp;=&nbsp;dp[u][0][1]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;k;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][i][0]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][i][1]&nbsp;=&nbsp;-inf;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;vec[u][i];<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt[u]&nbsp;+=&nbsp;dfs(v,&nbsp;u);<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;k;&nbsp;j&nbsp;&gt;=&nbsp;0;&nbsp;j--)&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j][0]&nbsp;+=&nbsp;dp[v][0][0];<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j][1]&nbsp;+=&nbsp;dp[v][0][1];<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;jj&nbsp;=&nbsp;1;&nbsp;jj&nbsp;&lt;=&nbsp;j;&nbsp;jj++)&nbsp;{<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j][0]&nbsp;=&nbsp;min(dp[u][j][0],&nbsp;dp[u][j-jj][0]&nbsp;+&nbsp;dp[v][jj][0]);<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j][1]&nbsp;=&nbsp;max(dp[u][j][1],&nbsp;dp[u][j-jj][1]&nbsp;+&nbsp;dp[v][jj][1]);<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;jj&nbsp;=&nbsp;0;&nbsp;jj&nbsp;&lt;&nbsp;cnt[v]&nbsp;&amp;&amp;&nbsp;jj&nbsp;&lt;&nbsp;j;&nbsp;jj++)&nbsp;{<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j][0]&nbsp;=&nbsp;min(dp[u][j][0],&nbsp;dp[u][j-jj-1][0]);<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j][1]&nbsp;=&nbsp;max(dp[u][j][1],&nbsp;dp[u][j-jj-1][1]);<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;=&nbsp;k;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][i][0]&nbsp;+=&nbsp;val[u];<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][i][1]&nbsp;+=&nbsp;val[u];<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cnt[u];<br /><span style="color: #008080; ">59</span>&nbsp;}<br /><span style="color: #008080; ">60</span>&nbsp;<br /><span style="color: #008080; ">61</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;solve()&nbsp;{<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(cnt,&nbsp;0,&nbsp;sof(cnt));<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(1,&nbsp;-1);<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans1&nbsp;=&nbsp;dp[1][k][0],&nbsp;ans2&nbsp;=&nbsp;dp[1][k][1];<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;k&nbsp;&amp;&amp;&nbsp;n&nbsp;-&nbsp;cnt[i]&nbsp;&gt;=&nbsp;j&nbsp;;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans1&nbsp;=&nbsp;min(ans1,&nbsp;dp[i][k-j][0]);<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans2&nbsp;=&nbsp;max(ans2,&nbsp;dp[i][k-j][1]);<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;ans1&nbsp;&lt;&lt;&nbsp;"&nbsp;"&nbsp;&lt;&lt;&nbsp;ans2&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">72</span>&nbsp;}<br /><span style="color: #008080; ">73</span>&nbsp;<br /><span style="color: #008080; ">74</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(cin&nbsp;&gt;&gt;&nbsp;n&nbsp;&gt;&gt;&nbsp;k)&nbsp;{<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;val[i];<br /><span style="color: #008080; ">78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[i].clear();<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a,&nbsp;b;<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;a&nbsp;&gt;&gt;&nbsp;b;<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[a].pb(b);<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[b].pb(a);<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">86</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br /><span style="color: #008080; ">87</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">88</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">89</span>&nbsp;}<br /><span style="color: #008080; ">90</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/173737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-05-05 14:18 <a href="http://www.cppblog.com/y346491470/articles/173737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zoj 3582 Back to the Past - 期望 + dp</title><link>http://www.cppblog.com/y346491470/articles/171996.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Thu, 19 Apr 2012 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/171996.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/171996.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/171996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/171996.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/171996.html</trackback:ping><description><![CDATA[【题意】：略。<br /><br />【题解】：设dp[i][j]表示左边有i个洞亮，右边有j个洞亮离目标状态的期望。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;然后所有dp[ii][jj](ii &gt;= i &amp;&amp; jj &gt;= j)都是dp[i][j]的后继状态，由期望计算公式可以算出dp[i][j]的期望。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;这里转移会有个环，移项即可处理掉。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;要先预处理组合数、p的幂和(1-p)的幂。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;最后答案即为dp[0][0].<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;用记忆化搜索来写非常方便。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;110<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;dp[55][55];<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;p1[maxn],&nbsp;p2[maxn];<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;C[55][55];<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m;<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;p;<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;visit[55][55];<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;51;&nbsp;i++)&nbsp;C[i][0]&nbsp;=&nbsp;C[i][i]&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;&nbsp;51;&nbsp;i++)<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;&nbsp;i;&nbsp;j++)<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C[i][j]&nbsp;=&nbsp;C[i-1][j-1]&nbsp;+&nbsp;C[i-1][j];<br /><span style="color: #008080; ">33</span>&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;<br /><span style="color: #008080; ">35</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;a,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b)&nbsp;{<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;&amp;tmp&nbsp;=&nbsp;dp[a][b];<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(visit[a][b])&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;tmp;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[a][b]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(a&nbsp;&gt;=&nbsp;m&nbsp;&amp;&amp;&nbsp;b&nbsp;&gt;=&nbsp;m)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;tmp&nbsp;=&nbsp;0.0;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;1.0;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;=&nbsp;n&nbsp;-&nbsp;a;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;=&nbsp;n&nbsp;-&nbsp;b;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(i&nbsp;==&nbsp;0&nbsp;&amp;&amp;&nbsp;j&nbsp;==&nbsp;0)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;+=&nbsp;(dfs(a&nbsp;+&nbsp;i,&nbsp;b&nbsp;+&nbsp;j))&nbsp;*&nbsp;p1[i+j]&nbsp;*&nbsp;p2[2&nbsp;*&nbsp;n&nbsp;-&nbsp;a&nbsp;-&nbsp;b&nbsp;-&nbsp;i&nbsp;-&nbsp;j]&nbsp;*&nbsp;C[n-a][i]&nbsp;*&nbsp;C[n-b][j];<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;tmp&nbsp;/=&nbsp;(1&nbsp;-&nbsp;p2[2&nbsp;*&nbsp;n&nbsp;-&nbsp;a&nbsp;-&nbsp;b]);<br /><span style="color: #008080; ">48</span>&nbsp;}<br /><span style="color: #008080; ">49</span>&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d%lf",&nbsp;&amp;n,&nbsp;&amp;m,&nbsp;&amp;p))&nbsp;{<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!n&nbsp;&amp;&amp;&nbsp;!m)&nbsp;<span style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1[0]&nbsp;=&nbsp;p2[0]&nbsp;=&nbsp;1.0;<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;maxn;&nbsp;i++)&nbsp;p1[i]&nbsp;=&nbsp;p1[i-1]&nbsp;*&nbsp;p;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;maxn;&nbsp;i++)&nbsp;p2[i]&nbsp;=&nbsp;p2[i-1]&nbsp;*&nbsp;(1&nbsp;-&nbsp;p);<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(visit,&nbsp;<span style="color: #0000FF; ">false</span>,&nbsp;<span style="color: #0000FF; ">sizeof</span>(visit));<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%.6f\n",&nbsp;dfs(0,&nbsp;0));<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">61</span>&nbsp;}<br /><span style="color: #008080; ">62</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/171996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-04-19 16:20 <a href="http://www.cppblog.com/y346491470/articles/171996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uva 5811 Cards - 期望 + dp</title><link>http://www.cppblog.com/y346491470/articles/171977.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Thu, 19 Apr 2012 06:25:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/171977.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/171977.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/171977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/171977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/171977.html</trackback:ping><description><![CDATA[【题意】：略<br /><br />【题解】：期望dp，如果不考虑joker就变得非常简单。但现在joker可以变成任意花色，所以如果当前翻到joker需要枚举这个joker变成什么花色，取最小的期望即可。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;aa,&nbsp;bb,&nbsp;cc,&nbsp;dd;<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;dp[16][16][16][16][5][5];<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;visit[16][16][16][16][5][5];<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;a,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;c,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;d,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;big,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;small)&nbsp;{<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;&amp;tmp&nbsp;=&nbsp;dp[a][b][c][d][big][small];<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(visit[a][b][c][d][big][small])&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;tmp;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[a][b][c][d][big][small]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;now[]&nbsp;=&nbsp;{a,&nbsp;b,&nbsp;c,&nbsp;d};<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(big&nbsp;!=&nbsp;4)&nbsp;now[big]++;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(small&nbsp;!=&nbsp;4)&nbsp;now[small]++;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(now[0]&nbsp;&gt;=&nbsp;aa&nbsp;&amp;&amp;&nbsp;now[1]&nbsp;&gt;=&nbsp;bb&nbsp;&amp;&amp;&nbsp;now[2]&nbsp;&gt;=&nbsp;cc&nbsp;&amp;&amp;&nbsp;now[3]&nbsp;&gt;=&nbsp;dd)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;tmp&nbsp;=&nbsp;0.0;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;1.0;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;sum&nbsp;=&nbsp;now[0]&nbsp;+&nbsp;now[1]&nbsp;+&nbsp;now[2]&nbsp;+&nbsp;now[3];<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(a&nbsp;&lt;&nbsp;13)&nbsp;tmp&nbsp;+=&nbsp;dfs(a&nbsp;+&nbsp;1,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;big,&nbsp;small)&nbsp;*&nbsp;(13.0&nbsp;-&nbsp;a)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(b&nbsp;&lt;&nbsp;13)&nbsp;tmp&nbsp;+=&nbsp;dfs(a,&nbsp;b&nbsp;+&nbsp;1,&nbsp;c,&nbsp;d,&nbsp;big,&nbsp;small)&nbsp;*&nbsp;(13.0&nbsp;-&nbsp;b)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum);<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(c&nbsp;&lt;&nbsp;13)&nbsp;tmp&nbsp;+=&nbsp;dfs(a,&nbsp;b,&nbsp;c&nbsp;+&nbsp;1,&nbsp;d,&nbsp;big,&nbsp;small)&nbsp;*&nbsp;(13.0&nbsp;-&nbsp;c)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum);<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(d&nbsp;&lt;&nbsp;13)&nbsp;tmp&nbsp;+=&nbsp;dfs(a,&nbsp;b,&nbsp;c,&nbsp;d&nbsp;+&nbsp;1,&nbsp;big,&nbsp;small)&nbsp;*&nbsp;(13.0&nbsp;-&nbsp;d)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum);<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(big&nbsp;==&nbsp;4)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;tmp1&nbsp;=&nbsp;1e100;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp1&nbsp;=&nbsp;min(tmp1,&nbsp;dfs(a,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;0,&nbsp;small)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum));<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp1&nbsp;=&nbsp;min(tmp1,&nbsp;dfs(a,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;1,&nbsp;small)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum));<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp1&nbsp;=&nbsp;min(tmp1,&nbsp;dfs(a,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;2,&nbsp;small)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum));<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp1&nbsp;=&nbsp;min(tmp1,&nbsp;dfs(a,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;3,&nbsp;small)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum));<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;+=&nbsp;tmp1;<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(small&nbsp;==&nbsp;4)&nbsp;{<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;tmp1&nbsp;=&nbsp;1e100;<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp1&nbsp;=&nbsp;min(tmp1,&nbsp;dfs(a,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;big,&nbsp;0)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum));<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp1&nbsp;=&nbsp;min(tmp1,&nbsp;dfs(a,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;big,&nbsp;1)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum));<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp1&nbsp;=&nbsp;min(tmp1,&nbsp;dfs(a,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;big,&nbsp;2)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum));<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp1&nbsp;=&nbsp;min(tmp1,&nbsp;dfs(a,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;big,&nbsp;3)&nbsp;/&nbsp;(54.0&nbsp;-&nbsp;sum));<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;+=&nbsp;tmp1;<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;tmp;<br /><span style="color: #008080; ">56</span>&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;<br /><span style="color: #008080; ">58</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;T,&nbsp;Case&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;T;<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;aa&nbsp;&gt;&gt;&nbsp;bb&nbsp;&gt;&gt;&nbsp;cc&nbsp;&gt;&gt;&nbsp;dd;<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;cnt&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;+=&nbsp;max(aa&nbsp;-&nbsp;13,&nbsp;0);<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;+=&nbsp;max(bb&nbsp;-&nbsp;13,&nbsp;0);<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;+=&nbsp;max(cc&nbsp;-&nbsp;13,&nbsp;0);<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;+=&nbsp;max(dd&nbsp;-&nbsp;13,&nbsp;0);<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Case&nbsp;%d:&nbsp;",&nbsp;Case++);<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(cnt&nbsp;&gt;&nbsp;2)&nbsp;printf("-1.000\n");<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(visit,&nbsp;<span style="color: #0000FF; ">false</span>,&nbsp;<span style="color: #0000FF; ">sizeof</span>(visit));<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%.3f\n",&nbsp;dfs(0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;4,&nbsp;4));<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">76</span>&nbsp;}<br /><span style="color: #008080; ">77</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/171977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-04-19 14:25 <a href="http://www.cppblog.com/y346491470/articles/171977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CF 161D - 树dp</title><link>http://www.cppblog.com/y346491470/articles/171726.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Tue, 17 Apr 2012 03:04:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/171726.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/171726.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/171726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/171726.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/171726.html</trackback:ping><description><![CDATA[【题意】：给出一棵树，每条边的长度为1，问树上有多少点对的距离恰好为k。<br /><br />【题解】：用树的分治可解，但是写起来比较麻烦。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设状态dp[i][j]表示以i为根的子树的节点到i的距离恰为j的个数。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;然后利用乘法原理求出答案，再把儿子的信息传给父亲。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;50050<br /><span style="color: #008080; ">19</span>&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;k;<br /><span style="color: #008080; ">21</span>&nbsp;ll&nbsp;dp[50050][505];<br /><span style="color: #008080; ">22</span>&nbsp;ll&nbsp;ans;<br /><span style="color: #008080; ">23</span>&nbsp;vector&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;vec[maxn];<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fa)&nbsp;{<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(dp[u],&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(dp[u]));<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][0]&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;vec[u].size();<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;vec[u][i];<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v,&nbsp;u);<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;k;&nbsp;j++)&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;+=&nbsp;dp[u][j-1]&nbsp;*&nbsp;dp[v][k-j];<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;k;&nbsp;j++)<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j]&nbsp;+=&nbsp;dp[v][j-1];<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">38</span>&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v;<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(cin&nbsp;&gt;&gt;&nbsp;n&nbsp;&gt;&gt;&nbsp;k)&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;maxn;&nbsp;i++)&nbsp;vec[i].clear();<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;u&nbsp;&gt;&gt;&nbsp;v;<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[u].pb(v);<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[v].pb(u);<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(1,&nbsp;-1);<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;ans&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">54</span>&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/171726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-04-17 11:04 <a href="http://www.cppblog.com/y346491470/articles/171726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CF 152E - 状态压缩dp + 斯坦纳树 + 记录方案</title><link>http://www.cppblog.com/y346491470/articles/171718.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Tue, 17 Apr 2012 02:50:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/171718.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/171718.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/171718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/171718.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/171718.html</trackback:ping><description><![CDATA[【题意】：最基础的斯坦纳树。<br /><br />【题解】：只需要用spfa dp一次即可，要记录状态的前驱状态保存方案。<br /><br />【代码】：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp; 1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">&nbsp;10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">&nbsp;11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">&nbsp;12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">&nbsp;15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;29;<br /><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[210][1&lt;&lt;7],&nbsp;pre[210][1&lt;&lt;7];<br /><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m,&nbsp;k,&nbsp;nn,&nbsp;mm;<br /><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;hash[210];<br /><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maz[110][110];<br /><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;g[110][110];<br /><span style="color: #008080; ">&nbsp;27</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;visit[210][1&lt;&lt;7];<br /><span style="color: #008080; ">&nbsp;28</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dx[]&nbsp;=&nbsp;{0,&nbsp;0,&nbsp;-1,&nbsp;1};<br /><span style="color: #008080; ">&nbsp;29</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dy[]&nbsp;=&nbsp;{-1,&nbsp;1,&nbsp;0,&nbsp;0};<br /><span style="color: #008080; ">&nbsp;30</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;31</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Node&nbsp;{<br /><span style="color: #008080; ">&nbsp;32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;st;<br /><span style="color: #008080; ">&nbsp;33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node(){}<br /><span style="color: #008080; ">&nbsp;34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node(<span style="color: #0000FF; ">int</span>&nbsp;_u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;_st)&nbsp;{<br /><span style="color: #008080; ">&nbsp;35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;=&nbsp;_u,&nbsp;st&nbsp;=&nbsp;_st;<br /><span style="color: #008080; ">&nbsp;36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;37</span>&nbsp;};<br /><span style="color: #008080; ">&nbsp;38</span>&nbsp;queue&lt;Node&gt;&nbsp;que;<br /><span style="color: #008080; ">&nbsp;39</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;40</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;check(<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y)&nbsp;{<br /><span style="color: #008080; ">&nbsp;41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(x&nbsp;&gt;=&nbsp;0&nbsp;&amp;&amp;&nbsp;x&nbsp;&lt;&nbsp;n&nbsp;&amp;&amp;&nbsp;y&nbsp;&gt;=&nbsp;0&nbsp;&amp;&amp;&nbsp;y&nbsp;&lt;&nbsp;m)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">&nbsp;42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">&nbsp;43</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;44</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;update(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;st,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;w,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fa)&nbsp;{<br /><span style="color: #008080; ">&nbsp;46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dp[u][st]&nbsp;&gt;&nbsp;w)&nbsp;{<br /><span style="color: #008080; ">&nbsp;47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][st]&nbsp;=&nbsp;w;<br /><span style="color: #008080; ">&nbsp;48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre[u][st]&nbsp;=&nbsp;fa;<br /><span style="color: #008080; ">&nbsp;49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!visit[u][st])&nbsp;{<br /><span style="color: #008080; ">&nbsp;50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.push(Node(u,&nbsp;st));<br /><span style="color: #008080; ">&nbsp;51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[u][st]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">&nbsp;52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;54</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;55</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;56</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;st)&nbsp;{<br /><span style="color: #008080; ">&nbsp;57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x&nbsp;=&nbsp;u&nbsp;/&nbsp;m,&nbsp;y&nbsp;=&nbsp;u&nbsp;%&nbsp;m;<br /><span style="color: #008080; ">&nbsp;58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g[x][y]&nbsp;=&nbsp;'X';<br /><span style="color: #008080; ">&nbsp;59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(pre[u][st]&nbsp;==&nbsp;-1)&nbsp;<span style="color: #0000FF; ">return</span>;<br /><span style="color: #008080; ">&nbsp;60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;pre[u][st]&nbsp;/&nbsp;1000,&nbsp;stt&nbsp;=&nbsp;pre[u][st]&nbsp;%&nbsp;1000;<br /><span style="color: #008080; ">&nbsp;62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v,&nbsp;stt);<br /><span style="color: #008080; ">&nbsp;63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(stt&nbsp;-&nbsp;st)&nbsp;dfs(v,&nbsp;st&nbsp;-&nbsp;stt);<span style="color: #008000; ">//</span><span style="color: #008000; ">牛叉的记录，拆分当前状态</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;64</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;65</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;66</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;67</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;solve()&nbsp;{<br /><span style="color: #008080; ">&nbsp;68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(!que.empty())&nbsp;{<br /><span style="color: #008080; ">&nbsp;69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;now&nbsp;=&nbsp;que.front();<br /><span style="color: #008080; ">&nbsp;70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.pop();<br /><span style="color: #008080; ">&nbsp;71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u&nbsp;=&nbsp;now.u,&nbsp;x&nbsp;=&nbsp;now.u&nbsp;/&nbsp;m,&nbsp;y&nbsp;=&nbsp;now.u&nbsp;%&nbsp;m,&nbsp;st&nbsp;=&nbsp;now.st;<br /><span style="color: #008080; ">&nbsp;72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[u][st]&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">&nbsp;73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;4;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;xx&nbsp;=&nbsp;x&nbsp;+&nbsp;dx[i],&nbsp;yy&nbsp;=&nbsp;y&nbsp;+&nbsp;dy[i];<br /><span style="color: #008080; ">&nbsp;75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!check(xx,&nbsp;yy))&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">&nbsp;76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;xx&nbsp;*&nbsp;m&nbsp;+&nbsp;yy;<br /><span style="color: #008080; ">&nbsp;77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update(v,&nbsp;st,&nbsp;dp[u][st]&nbsp;+&nbsp;maz[xx][yy],&nbsp;u&nbsp;*&nbsp;1000&nbsp;+&nbsp;st);<br /><span style="color: #008080; ">&nbsp;78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;t&nbsp;=&nbsp;mm&nbsp;-&nbsp;1&nbsp;-&nbsp;st;<br /><span style="color: #008080; ">&nbsp;80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;t;&nbsp;i;&nbsp;i&nbsp;=&nbsp;(i-1)&nbsp;&amp;&nbsp;t)&nbsp;{<br /><span style="color: #008080; ">&nbsp;81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update(u,&nbsp;i&nbsp;|&nbsp;st,&nbsp;dp[u][i]&nbsp;+&nbsp;dp[u][st]&nbsp;-&nbsp;maz[x][y],&nbsp;u&nbsp;*&nbsp;1000&nbsp;+&nbsp;st);<br /><span style="color: #008080; ">&nbsp;82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;84</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans&nbsp;=&nbsp;inf,&nbsp;u;<br /><span style="color: #008080; ">&nbsp;85</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nn;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;86</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ans&nbsp;&gt;&nbsp;dp[i][mm-1])&nbsp;{<br /><span style="color: #008080; ">&nbsp;87</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;=&nbsp;dp[i][mm-1];<br /><span style="color: #008080; ">&nbsp;88</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;=&nbsp;i;<br /><span style="color: #008080; ">&nbsp;89</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;90</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;91</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(u,&nbsp;mm&nbsp;-&nbsp;1);<br /><span style="color: #008080; ">&nbsp;92</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;ans&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">&nbsp;93</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;94</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;m;&nbsp;j++)<br /><span style="color: #008080; ">&nbsp;95</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;g[i][j];<br /><span style="color: #008080; ">&nbsp;96</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">&nbsp;97</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;98</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;99</span>&nbsp;<br /><span style="color: #008080; ">100</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">101</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(cin&nbsp;&gt;&gt;&nbsp;n&nbsp;&gt;&gt;&nbsp;m&nbsp;&gt;&gt;&nbsp;k)&nbsp;{<br /><span style="color: #008080; ">102</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(!que.empty())&nbsp;que.pop();<br /><span style="color: #008080; ">103</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">104</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;m;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">105</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;maz[i][j];<br /><span style="color: #008080; ">106</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g[i][j]&nbsp;=&nbsp;'.';<br /><span style="color: #008080; ">107</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">108</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">109</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nn&nbsp;=&nbsp;n&nbsp;*&nbsp;m,&nbsp;mm&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;k;<br /><span style="color: #008080; ">110</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(hash,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(hash));<br /><span style="color: #008080; ">111</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(visit,&nbsp;<span style="color: #0000FF; ">false</span>,&nbsp;<span style="color: #0000FF; ">sizeof</span>(visit));<br /><span style="color: #008080; ">112</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nn;&nbsp;i++)&nbsp;<br /><span style="color: #008080; ">113</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;mm;&nbsp;j++)<br /><span style="color: #008080; ">114</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][j]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">115</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0,&nbsp;a,&nbsp;b;&nbsp;i&nbsp;&lt;&nbsp;k;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">116</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;a&nbsp;&gt;&gt;&nbsp;b;<br /><span style="color: #008080; ">117</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a--,&nbsp;b--;<br /><span style="color: #008080; ">118</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u&nbsp;=&nbsp;a&nbsp;*&nbsp;m&nbsp;+&nbsp;b;<br /><span style="color: #008080; ">119</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash[u]&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;i;<br /><span style="color: #008080; ">120</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update(u,&nbsp;hash[u],&nbsp;maz[a][b],&nbsp;-1);<br /><span style="color: #008080; ">121</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">122</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br /><span style="color: #008080; ">123</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">124</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">125</span>&nbsp;}<br /><span style="color: #008080; ">126</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/171718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-04-17 10:50 <a href="http://www.cppblog.com/y346491470/articles/171718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 4085 Peach Blossom Spring - 状态压缩dp + 斯坦纳树</title><link>http://www.cppblog.com/y346491470/articles/171534.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sun, 15 Apr 2012 11:40:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/171534.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/171534.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/171534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/171534.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/171534.html</trackback:ping><description><![CDATA[【题意】：<span>n(n&lt;=50)个点，m(m&lt;=1000)条无向边，求前k个点(house)和末k个点(broken house)互相&#8220;连通&#8221;的最小代价。这里的连通是指，对于任意一个house必须和一个broken house 连通，且任意一个house只能对应一个broken house 作为连通的对象。（抄3X的题意）</span><br /><br />【题解】：斯坦纳树。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;要做两次dp，第一次求出所有状态的最小费用，第二次合并状态求出最优值即为答案。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;合并状态时必须是合法状态才能够转移，既居民点个数 == 避难所个数。&nbsp;<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp; 1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">&nbsp;10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">&nbsp;11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">&nbsp;12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">&nbsp;15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;55<br /><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxm&nbsp;2500<br /><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;20;<br /><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;eh[maxn],&nbsp;tot;<br /><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m,&nbsp;k;<br /><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Edge&nbsp;{<br /><span style="color: #008080; ">&nbsp;27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;w,&nbsp;next;<br /><span style="color: #008080; ">&nbsp;28</span>&nbsp;}et[maxm];<br /><span style="color: #008080; ">&nbsp;29</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[maxn][1&lt;&lt;10];<br /><span style="color: #008080; ">&nbsp;30</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;visit[maxn][1&lt;&lt;10];<br /><span style="color: #008080; ">&nbsp;31</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;hash[maxn];<br /><span style="color: #008080; ">&nbsp;32</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;minn[1&lt;&lt;10];<br /><span style="color: #008080; ">&nbsp;33</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br /><span style="color: #008080; ">&nbsp;34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tot&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(eh,&nbsp;-1,&nbsp;<span style="color: #0000FF; ">sizeof</span>(eh));<br /><span style="color: #008080; ">&nbsp;36</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;37</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;38</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;addedge(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;w)&nbsp;{<br /><span style="color: #008080; ">&nbsp;39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edge&nbsp;e&nbsp;=&nbsp;{u,&nbsp;v,&nbsp;w,&nbsp;eh[u]};<br /><span style="color: #008080; ">&nbsp;40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;et[tot]&nbsp;=&nbsp;e;<br /><span style="color: #008080; ">&nbsp;41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eh[u]&nbsp;=&nbsp;tot++;<br /><span style="color: #008080; ">&nbsp;42</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;43</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;44</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;check(<span style="color: #0000FF; ">int</span>&nbsp;mask)&nbsp;{<span style="color: #008000; ">//</span><span style="color: #008000; ">判断合法状态</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;0,&nbsp;b&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;k;&nbsp;i++)<br /><span style="color: #008080; ">&nbsp;47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(mask&nbsp;&amp;&nbsp;(1&lt;&lt;i))&nbsp;a++;<br /><span style="color: #008080; ">&nbsp;48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;k;&nbsp;i&nbsp;&lt;&nbsp;2&nbsp;*&nbsp;k;&nbsp;i++)&nbsp;<br /><span style="color: #008080; ">&nbsp;49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(mask&nbsp;&amp;&nbsp;(1&lt;&lt;i))&nbsp;b++;<br /><span style="color: #008080; ">&nbsp;50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;a&nbsp;==&nbsp;b;<br /><span style="color: #008080; ">&nbsp;51</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;52</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;53</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;solve()&nbsp;{<br /><span style="color: #008080; ">&nbsp;54</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(visit,&nbsp;<span style="color: #0000FF; ">false</span>,&nbsp;<span style="color: #0000FF; ">sizeof</span>(visit));<br /><span style="color: #008080; ">&nbsp;56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;<span style="color: #0000FF; ">base</span>&nbsp;=&nbsp;10000,&nbsp;nn&nbsp;=&nbsp;1&lt;&lt;(2*k);<br /><span style="color: #008080; ">&nbsp;57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;que;<br /><span style="color: #008080; ">&nbsp;58</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash[i]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nn;&nbsp;j++)<br /><span style="color: #008080; ">&nbsp;62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][j]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">&nbsp;63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;64</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;k;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash[i]&nbsp;=&nbsp;1&lt;&lt;(i-1);<br /><span style="color: #008080; ">&nbsp;67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][hash[i]]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.push(i&nbsp;*&nbsp;<span style="color: #0000FF; ">base</span>&nbsp;+&nbsp;hash[i]);<br /><span style="color: #008080; ">&nbsp;69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[i][hash[i]]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">&nbsp;70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;k;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash[n-i]&nbsp;=&nbsp;1&lt;&lt;(k+i);<br /><span style="color: #008080; ">&nbsp;74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[n-i][hash[n-i]]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.push((n-i)&nbsp;*&nbsp;<span style="color: #0000FF; ">base</span>&nbsp;+&nbsp;hash[n-i]);<br /><span style="color: #008080; ">&nbsp;76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[n-i][hash[n-i]]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">&nbsp;77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;78</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(!que.empty())&nbsp;{<br /><span style="color: #008080; ">&nbsp;80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u&nbsp;=&nbsp;que.front();<br /><span style="color: #008080; ">&nbsp;81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.pop();<br /><span style="color: #008080; ">&nbsp;82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;mask&nbsp;=&nbsp;u&nbsp;%&nbsp;<span style="color: #0000FF; ">base</span>;<br /><span style="color: #008080; ">&nbsp;83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;/=&nbsp;<span style="color: #0000FF; ">base</span>;<br /><span style="color: #008080; ">&nbsp;84</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[u][mask]&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">&nbsp;85</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;now&nbsp;=&nbsp;eh[u];&nbsp;now&nbsp;!=&nbsp;-1;&nbsp;now&nbsp;=&nbsp;et[now].next)&nbsp;{<br /><span style="color: #008080; ">&nbsp;86</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;et[now].v,&nbsp;w&nbsp;=&nbsp;et[now].w;<br /><span style="color: #008080; ">&nbsp;87</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nmask&nbsp;=&nbsp;mask&nbsp;|&nbsp;hash[v];<br /><span style="color: #008080; ">&nbsp;88</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dp[v][nmask]&nbsp;&gt;&nbsp;dp[u][mask]&nbsp;+&nbsp;w)&nbsp;{<br /><span style="color: #008080; ">&nbsp;89</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[v][nmask]&nbsp;=&nbsp;dp[u][mask]&nbsp;+&nbsp;w;<br /><span style="color: #008080; ">&nbsp;90</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!visit[v][nmask])&nbsp;{<br /><span style="color: #008080; ">&nbsp;91</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.push(v&nbsp;*&nbsp;<span style="color: #0000FF; ">base</span>&nbsp;+&nbsp;nmask);<br /><span style="color: #008080; ">&nbsp;92</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[v][nmask]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">&nbsp;93</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;94</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;95</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;96</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;t&nbsp;=&nbsp;nn&nbsp;-&nbsp;1&nbsp;-&nbsp;mask;<br /><span style="color: #008080; ">&nbsp;97</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;t;&nbsp;i;&nbsp;i&nbsp;=&nbsp;(i-1)&nbsp;&amp;&nbsp;t)&nbsp;{<br /><span style="color: #008080; ">&nbsp;98</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nmask&nbsp;=&nbsp;mask&nbsp;|&nbsp;i;<br /><span style="color: #008080; ">&nbsp;99</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dp[u][nmask]&nbsp;&gt;&nbsp;dp[u][mask]&nbsp;+&nbsp;dp[u][i|hash[u]])&nbsp;{<br /><span style="color: #008080; ">100</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][nmask]&nbsp;=&nbsp;dp[u][mask]&nbsp;+&nbsp;dp[u][i|hash[u]];<br /><span style="color: #008080; ">101</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!visit[u][nmask])&nbsp;{<br /><span style="color: #008080; ">102</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.push(u&nbsp;*&nbsp;<span style="color: #0000FF; ">base</span>&nbsp;+&nbsp;nmask);<br /><span style="color: #008080; ">103</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[u][nmask]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">104</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">105</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">106</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">107</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">108</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">109</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nn;&nbsp;i++)<br /><span style="color: #008080; ">110</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minn[i]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">111</span>&nbsp;<br /><span style="color: #008080; ">112</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;<br /><span style="color: #008080; ">113</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nn;&nbsp;j++)<br /><span style="color: #008080; ">114</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minn[j]&nbsp;=&nbsp;min(minn[j],&nbsp;dp[i][j]);<br /><span style="color: #008080; ">115</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">116</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;nn;&nbsp;i++)<br /><span style="color: #008080; ">117</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(check(i))<br /><span style="color: #008080; ">118</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i;&nbsp;j;&nbsp;j&nbsp;=&nbsp;(j-1)&nbsp;&amp;&nbsp;i)<br /><span style="color: #008080; ">119</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(check(j))&nbsp;minn[i]&nbsp;=&nbsp;min(minn[i],&nbsp;minn[j]&nbsp;+&nbsp;minn[i-j]);<br /><span style="color: #008080; ">120</span>&nbsp;<br /><span style="color: #008080; ">121</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans&nbsp;=&nbsp;minn[nn-1];<br /><span style="color: #008080; ">122</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ans&nbsp;==&nbsp;inf)&nbsp;cout&nbsp;&lt;&lt;&nbsp;"No&nbsp;solution"&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">123</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;cout&nbsp;&lt;&lt;&nbsp;ans&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">124</span>&nbsp;}<br /><span style="color: #008080; ">125</span>&nbsp;<br /><span style="color: #008080; ">126</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">127</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;T;<br /><span style="color: #008080; ">128</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;T);<br /><span style="color: #008080; ">129</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">130</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d",&nbsp;&amp;n,&nbsp;&amp;m,&nbsp;&amp;k);<br /><span style="color: #008080; ">131</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br /><span style="color: #008080; ">132</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;m;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">133</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;w;<br /><span style="color: #008080; ">134</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d",&nbsp;&amp;u,&nbsp;&amp;v,&nbsp;&amp;w);<br /><span style="color: #008080; ">135</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addedge(u,&nbsp;v,&nbsp;w);<br /><span style="color: #008080; ">136</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addedge(v,&nbsp;u,&nbsp;w);<br /><span style="color: #008080; ">137</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">138</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br /><span style="color: #008080; ">139</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">140</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">141</span>&nbsp;}<br /><span style="color: #008080; ">142</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/171534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-04-15 19:40 <a href="http://www.cppblog.com/y346491470/articles/171534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FZU 月赛 E题 - 树dp + 树最小支配集变形</title><link>http://www.cppblog.com/y346491470/articles/171478.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sun, 15 Apr 2012 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/171478.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/171478.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/171478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/171478.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/171478.html</trackback:ping><description><![CDATA[【题意】：shadow酷爱探险，这次shadow来到了一个洞穴中，他发现这个幽深的洞穴由一些房间（相对较为宽敞的区域）和连接这些房间的通道构成，它们形成了一个树形结构。当shadow探索完整个洞穴出来后，他觉得这里可以作为一个旅游景点来开发，但首先他必须解决这个洞穴中的照明问题。由于这个洞穴中的通道都较为笔直，因而在洞穴中的任意房间建立照明设施都可以照亮与其直接相连的所有房间，但在每个房间建立照明设施所需的费用又因地形不同而不同，所以shadow想知道要照亮整个洞穴所需的最少费用是多少。<br /><br />【题解】：与poj 3659类似，只是每个点有一个权值而已。<br /><br />【代码】：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;50050<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxm&nbsp;500500<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;ll&nbsp;inf&nbsp;=&nbsp;1LL&nbsp;&lt;&lt;&nbsp;60;<br /><span style="color: #008080; ">24</span>&nbsp;ll&nbsp;val[maxn],&nbsp;dp[maxn][3];<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n;<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;eh[maxn],&nbsp;tot;<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Edge&nbsp;{<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v,&nbsp;next;<br /><span style="color: #008080; ">29</span>&nbsp;}et[maxm];<br /><span style="color: #008080; ">30</span>&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tot&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(eh,&nbsp;-1,&nbsp;<span style="color: #0000FF; ">sizeof</span>(eh));<br /><span style="color: #008080; ">34</span>&nbsp;}<br /><span style="color: #008080; ">35</span>&nbsp;<br /><span style="color: #008080; ">36</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;addedge(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v)&nbsp;{<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edge&nbsp;e&nbsp;=&nbsp;{v,&nbsp;eh[u]};<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;et[tot]&nbsp;=&nbsp;e;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eh[u]&nbsp;=&nbsp;tot++;<br /><span style="color: #008080; ">40</span>&nbsp;}<br /><span style="color: #008080; ">41</span>&nbsp;<br /><span style="color: #008080; ">42</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fa)&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][0]&nbsp;=&nbsp;val[u];<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][1]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][2]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;isleaf&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;eh[u];&nbsp;i&nbsp;!=&nbsp;-1;&nbsp;i&nbsp;=&nbsp;et[i].next)&nbsp;{<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;et[i].v;<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v,&nbsp;u);<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isleaf&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][0]&nbsp;+=&nbsp;min(dp[v][0],&nbsp;dp[v][2]);<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][2]&nbsp;+=&nbsp;min(dp[v][0],&nbsp;dp[v][1]);<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!isleaf)&nbsp;{<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;eh[u];&nbsp;i&nbsp;!=&nbsp;-1;&nbsp;i&nbsp;=&nbsp;et[i].next)&nbsp;{<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;et[i].v;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][1]&nbsp;=&nbsp;min(dp[u][1],&nbsp;dp[u][2]&nbsp;-&nbsp;min(dp[v][0],&nbsp;dp[v][1])&nbsp;+&nbsp;dp[v][0]);<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">62</span>&nbsp;}<br /><span style="color: #008080; ">63</span>&nbsp;<br /><span style="color: #008080; ">64</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;T,&nbsp;u,&nbsp;v,&nbsp;Case&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;T);<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;n);<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%I64d",&nbsp;&amp;val[i]);<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;u,&nbsp;&amp;v);<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addedge(u,&nbsp;v),&nbsp;addedge(v,&nbsp;u);<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(1,&nbsp;-1);<br /><span style="color: #008080; ">78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Case&nbsp;%d:&nbsp;%I64d\n",&nbsp;Case++,&nbsp;min(dp[1][0],&nbsp;dp[1][1]));<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">81</span>&nbsp;}<br /><span style="color: #008080; ">82</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/171478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-04-15 16:06 <a href="http://www.cppblog.com/y346491470/articles/171478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 3659 Cell Phone Network - 树dp + 树最小支配集</title><link>http://www.cppblog.com/y346491470/articles/171475.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sun, 15 Apr 2012 07:55:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/171475.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/171475.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/171475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/171475.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/171475.html</trackback:ping><description><![CDATA[【题意】：求树的最小支配集<br /><br />【题解】：经典树dp题目，求树最小支配集。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设dp[u][0]表示选择u这个点，且以u为根的子树完全被覆盖的最小个数。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设dp[u][1]表示u这个点被其儿子覆盖，且以u为根的子树完全被覆盖的最小个数。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设dp[u][2]表示u这个点被其父亲覆盖，且以u为根的子树完全被覆盖的最小个数。<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 然后转移就好明显了。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;10050<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;20;<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;dp[maxn][3];<br /><span style="color: #008080; ">24</span>&nbsp;vector&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;vec[maxn];<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fa)&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][0]&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][1]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][2]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;vec[u].size();<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;isleaf&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;vec[u][i];<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v,&nbsp;u);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isleaf&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][0]&nbsp;+=&nbsp;min(dp[v][0],&nbsp;dp[v][2]);<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][2]&nbsp;+=&nbsp;min(dp[v][0],&nbsp;dp[v][1]);<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!isleaf)&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;vec[u][i];<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][1]&nbsp;=&nbsp;min(dp[u][1],&nbsp;dp[u][2]&nbsp;-&nbsp;min(dp[v][0],&nbsp;dp[v][1])&nbsp;+&nbsp;dp[v][0]);<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">47</span>&nbsp;}<br /><span style="color: #008080; ">48</span>&nbsp;<br /><span style="color: #008080; ">49</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d",&nbsp;&amp;n))&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;maxn;&nbsp;i++)&nbsp;vec[i].clear();<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1,&nbsp;a,&nbsp;b;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;a,&nbsp;&amp;b);<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[a].pb(b);<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[b].pb(a);<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(1,&nbsp;-1);<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;min(dp[1][0],&nbsp;dp[1][1])&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">61</span>&nbsp;}<br /><span style="color: #008080; ">62</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/171475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-04-15 15:55 <a href="http://www.cppblog.com/y346491470/articles/171475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 3001 Travelling - 状态压缩dp + 三进制</title><link>http://www.cppblog.com/y346491470/articles/170837.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Tue, 10 Apr 2012 15:53:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/170837.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/170837.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/170837.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/170837.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/170837.html</trackback:ping><description><![CDATA[【题意】：每个节点可以最多访问两次，求访问完所有点的最小费用。<br /><br />【题解】：求哈密顿路，只是多了点条件，果断状态压缩dp+三进制。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;通过这题瞬间领会了k进制的操作，好！<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;20;<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[11][65000];<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maz[15][15];<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;p[15];<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[0]&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;15;&nbsp;i++)&nbsp;p[i]&nbsp;=&nbsp;p[i-1]&nbsp;*&nbsp;3;<br /><span style="color: #008080; ">29</span>&nbsp;}<br /><span style="color: #008080; ">30</span>&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m;<br /><span style="color: #008080; ">32</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a,&nbsp;b,&nbsp;c;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d",&nbsp;&amp;n,&nbsp;&amp;m))&nbsp;{<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;n;&nbsp;j++)<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maz[i][j]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(m--)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;a&nbsp;&gt;&gt;&nbsp;b&nbsp;&gt;&gt;&nbsp;c;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a--,&nbsp;b--;<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(c&nbsp;&lt;&nbsp;maz[a][b])&nbsp;maz[a][b]&nbsp;=&nbsp;maz[b][a]&nbsp;=&nbsp;c;<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">44</span>&nbsp;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nn&nbsp;=&nbsp;p[n];<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nn;&nbsp;j++)&nbsp;dp[i][j]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][p[i]]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nn;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x&nbsp;=&nbsp;j&nbsp;/&nbsp;p[i]&nbsp;%&nbsp;3;<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(x&nbsp;&gt;&nbsp;0)&nbsp;{<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;n;&nbsp;k++)&nbsp;{<br /><span style="color: #008080; ">56</span>&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 style="color: #0000FF; ">int</span>&nbsp;y&nbsp;=&nbsp;j&nbsp;/&nbsp;p[k]&nbsp;%&nbsp;3;<br /><span style="color: #008080; ">57</span>&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 style="color: #0000FF; ">if</span>(maz[i][k]&nbsp;!=&nbsp;inf&nbsp;&amp;&amp;&nbsp;y&nbsp;&lt;=&nbsp;1)&nbsp;&nbsp;{<br /><span style="color: #008080; ">58</span>&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;<span style="color: #0000FF; ">int</span>&nbsp;nmask&nbsp;=&nbsp;j&nbsp;+&nbsp;p[k];<br /><span style="color: #008080; ">59</span>&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;dp[k][nmask]&nbsp;=&nbsp;min(dp[k][nmask],&nbsp;dp[i][j]&nbsp;+&nbsp;maz[i][k]);<br /><span style="color: #008080; ">60</span>&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 /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nn;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;flag&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;n;&nbsp;k++)<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>((j&nbsp;/&nbsp;p[k]&nbsp;%&nbsp;3)&nbsp;==&nbsp;0)&nbsp;{<br /><span style="color: #008080; ">71</span>&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;flag&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">72</span>&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 style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(flag)&nbsp;ans&nbsp;=&nbsp;min(ans,&nbsp;dp[i][j]);<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">77</span>&nbsp;<br /><span style="color: #008080; ">78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ans&nbsp;!=&nbsp;inf)&nbsp;cout&nbsp;&lt;&lt;&nbsp;ans&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;cout&nbsp;&lt;&lt;&nbsp;-1&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">82</span>&nbsp;}<br /><span style="color: #008080; ">83</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/170837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-04-10 23:53 <a href="http://www.cppblog.com/y346491470/articles/170837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 3586 Information Disturbing - 二分 + 树dp</title><link>http://www.cppblog.com/y346491470/articles/170147.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Thu, 05 Apr 2012 06:10:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/170147.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/170147.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/170147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/170147.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/170147.html</trackback:ping><description><![CDATA[<span style="font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">【题意】：给出一棵树，根节点为1，每条边有一个代价。要求切去其所有的叶子节点，且总代价不能超过m，问切去的边中的最大的边最小是多少。</span>&nbsp;<br /><br />【题解】：最大值最小问题，基本上就是二分答案+判定。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;这题的判定需要用到树dp。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设状态dp[u]为以u为根的子树切去其下方叶子节点的最少代价。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;非叶子节点：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dp[u] += min(dp[v], w(u, v)),&nbsp;v 为 u 儿子。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;叶子节点：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dp[u] = inf;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;最后判断dp[1]与m的关系就可以了。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;1010<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;20;<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m,&nbsp;limit;<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[maxn];<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Edge&nbsp;{<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v,&nbsp;w;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edge(){}<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edge(<span style="color: #0000FF; ">int</span>&nbsp;_v,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;_w)&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;=&nbsp;_v,&nbsp;w&nbsp;=&nbsp;_w;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">31</span>&nbsp;};<br /><span style="color: #008080; ">32</span>&nbsp;vector&lt;Edge&gt;&nbsp;vec[maxn];<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fa)&nbsp;{<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;vec[u].size();<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;vec[u][i].v,&nbsp;w&nbsp;=&nbsp;vec[u][i].w;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(w&nbsp;&gt;&nbsp;limit)&nbsp;w&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v,&nbsp;u);<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u]&nbsp;+=&nbsp;min(dp[v],&nbsp;w);<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!dp[u])&nbsp;dp[u]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">45</span>&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;<br /><span style="color: #008080; ">47</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;solve()&nbsp;{<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans&nbsp;=&nbsp;-1;<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l&nbsp;=&nbsp;1,&nbsp;r&nbsp;=&nbsp;1000;<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(l&nbsp;&lt;=&nbsp;r)&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;mid&nbsp;=&nbsp;(l&nbsp;+&nbsp;r)&nbsp;&gt;&gt;&nbsp;1;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;limit&nbsp;=&nbsp;mid;<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(1,&nbsp;-1);<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dp[1]&nbsp;&lt;=&nbsp;m)&nbsp;ans&nbsp;=&nbsp;mid,&nbsp;r&nbsp;=&nbsp;mid&nbsp;-&nbsp;1;<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;l&nbsp;=&nbsp;mid&nbsp;+&nbsp;1;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;ans&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">58</span>&nbsp;}<br /><span style="color: #008080; ">59</span>&nbsp;<br /><span style="color: #008080; ">60</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d",&nbsp;&amp;n,&nbsp;&amp;m))&nbsp;{<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!n)&nbsp;<span style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;vec[i].clear();<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;w;<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d",&nbsp;&amp;u,&nbsp;&amp;v,&nbsp;&amp;w);<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[u].pb(Edge(v,&nbsp;w));<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[v].pb(Edge(u,&nbsp;w));<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">73</span>&nbsp;}<br /><span style="color: #008080; ">74</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/170147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-04-05 14:10 <a href="http://www.cppblog.com/y346491470/articles/170147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 3398 Perfect Service - 树dp</title><link>http://www.cppblog.com/y346491470/articles/169041.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Mon, 26 Mar 2012 10:32:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/169041.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/169041.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/169041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/169041.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/169041.html</trackback:ping><description><![CDATA[【题意】：给出一棵树，每个节点代表一台电脑，现在需要选择一些电脑作为服务器。如果一台电脑被选作服务器，那么它和和它相邻的电脑都会被激活，非服务器的电脑不能同时被多台服务器激活。问最少要选多少台电脑作为服务器使得所有电脑被激活。<br /><br />【题解】：树dp，树的最小支配集变形。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设状态<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dp[u][0] 以u为根且u为服务器且整棵子树都被激活的最小代价。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dp[u][1] 以u为根且u被某个儿子结点激活且整棵子树都被激活的最小代价。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dp[u][2]&nbsp;以u为根且u被父亲结点激活且整棵子树都被激活的最小代价。<br />&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;转移 (v 为 u 的儿子)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dp[u][0] = &#8721;min(dp[v][0], dp[v][2]) + 1;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dp[u][1] = min(sum - dp[v][1] + dp[v][0]), sum = &#8721;dp[v][1];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dp[u][2] = &#8721;dp[v][1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;任取一个结点为root进行树dp, ans = min(dp[root][0], dp[root][1]).<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;10050<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;20;<br /><span style="color: #008080; ">23</span>&nbsp;vector&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;vec[maxn];<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;dp[maxn][3];<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fa)&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;vec[u].size();<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][0]&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][1]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][2]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;vec[u][i];<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v,&nbsp;u);<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][0]&nbsp;+=&nbsp;min(dp[v][2],&nbsp;dp[v][0]);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][2]&nbsp;+=&nbsp;dp[v][1];<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;vec[u][i];<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][1]&nbsp;=&nbsp;min(dp[u][1],&nbsp;dp[u][2]&nbsp;-&nbsp;dp[v][1]&nbsp;+&nbsp;dp[v][0]);<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">43</span>&nbsp;}<br /><span style="color: #008080; ">44</span>&nbsp;<br /><span style="color: #008080; ">45</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;symbol&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(symbol&nbsp;!=&nbsp;-1)&nbsp;{<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;n);<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;maxn;&nbsp;i++)&nbsp;vec[i].clear();<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1,&nbsp;a,&nbsp;b;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;a,&nbsp;&amp;b);<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[a].pb(b);<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[b].pb(a);<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;symbol);<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(1,&nbsp;-1);<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;min(dp[1][0],&nbsp;dp[1][1])&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">60</span>&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/169041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-03-26 18:32 <a href="http://www.cppblog.com/y346491470/articles/169041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 3660 Alice and Bob's Trip - 树dp</title><link>http://www.cppblog.com/y346491470/articles/168858.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sat, 24 Mar 2012 18:26:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/168858.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/168858.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/168858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/168858.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/168858.html</trackback:ping><description><![CDATA[【题意】：给出一棵n个结点的有向树，两个人一起走，轮流决策，Alice的目的是使最后的距离最小，Bob的目的是使最后的距离最大。问最后的距离能否满足在区间[L,R]。需要走到不能走的地方才能停。<br /><br />【题解】：这题要注意的是，可能还没有走到叶子结点就停止了。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;然后就是一个树形dp。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;对于一棵给定的树，每个结点轮到谁决策是确定的。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;根据当前不同的人，选择满足当前区间[L',R']最大值或者最小值。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxm&nbsp;600000&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;505000<br /><span style="color: #008080; ">23</span>&nbsp;<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;L,&nbsp;R;<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;tot,&nbsp;eh[maxn];<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[maxn];<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Edge&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v,&nbsp;w,&nbsp;next;<br /><span style="color: #008080; ">30</span>&nbsp;}et[maxm];<br /><span style="color: #008080; ">31</span>&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tot&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(eh,&nbsp;-1,&nbsp;<span style="color: #0000FF; ">sizeof</span>(eh));<br /><span style="color: #008080; ">35</span>&nbsp;}<br /><span style="color: #008080; ">36</span>&nbsp;<br /><span style="color: #008080; ">37</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;addedge(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;w)&nbsp;{<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edge&nbsp;e&nbsp;=&nbsp;{v,&nbsp;w,&nbsp;eh[u]};<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;et[tot]&nbsp;=&nbsp;e;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eh[u]&nbsp;=&nbsp;tot++;<br /><span style="color: #008080; ">41</span>&nbsp;}<br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;L,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;R,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;flag)&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;eh[u];&nbsp;i&nbsp;!=&nbsp;-1;&nbsp;i&nbsp;=&nbsp;et[i].next)&nbsp;{<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;et[i].v,&nbsp;w&nbsp;=&nbsp;et[i].w;<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v,&nbsp;L&nbsp;-&nbsp;w,&nbsp;R&nbsp;-&nbsp;w,&nbsp;!flag);<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dp[v]&nbsp;+&nbsp;w&nbsp;&gt;=&nbsp;L&nbsp;&amp;&amp;&nbsp;dp[v]&nbsp;+&nbsp;w&nbsp;&lt;=&nbsp;R)&nbsp;{<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dp[u]&nbsp;==&nbsp;0)&nbsp;dp[u]&nbsp;=&nbsp;dp[v]&nbsp;+&nbsp;w;<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(flag)&nbsp;dp[u]&nbsp;=&nbsp;max(dp[u],&nbsp;dp[v]&nbsp;+&nbsp;w);<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;dp[u]&nbsp;=&nbsp;min(dp[u],&nbsp;dp[v]&nbsp;+&nbsp;w);<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;<br /><span style="color: #008080; ">58</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;w;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d%d",&nbsp;&amp;n,&nbsp;&amp;L,&nbsp;&amp;R))&nbsp;{<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d",&nbsp;&amp;u,&nbsp;&amp;v,&nbsp;&amp;w);<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addedge(u,&nbsp;v,&nbsp;w);<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(0,&nbsp;L,&nbsp;R,&nbsp;1);<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(R&nbsp;&lt;&nbsp;L&nbsp;||&nbsp;dp[0]&nbsp;&lt;&nbsp;L&nbsp;||&nbsp;dp[0]&nbsp;&gt;&nbsp;R)&nbsp;printf("Oh,&nbsp;my&nbsp;god!\n");<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;printf("%d\n",&nbsp;dp[0]);<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">71</span>&nbsp;}<br /><span style="color: #008080; ">72</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/168858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-03-25 02:26 <a href="http://www.cppblog.com/y346491470/articles/168858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 3538 A sample Hamilton path - 状态压缩dp + 哈密顿路</title><link>http://www.cppblog.com/y346491470/articles/168857.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sat, 24 Mar 2012 18:11:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/168857.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/168857.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/168857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/168857.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/168857.html</trackback:ping><description><![CDATA[【题意】：给出一个有向图，n个城市(n&lt;=21)，还有m个限制a b，表示要访问城市b要先访问城市a。求从0号城市出发的最短哈密顿路。<br /><br />【题解】：经典的状态压缩dp。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;fi&nbsp;first<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;se&nbsp;second<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;21<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1000000;<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m;<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[maxn][1&lt;&lt;maxn];<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maz[maxn][maxn];<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;limit[maxn];<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;solve()&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;(1&nbsp;&lt;&lt;&nbsp;n);&nbsp;j++)<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][j]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[0][1]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;mask&nbsp;=&nbsp;1;&nbsp;mask&nbsp;&lt;&nbsp;(1&lt;&lt;n);&nbsp;mask++)<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;n;&nbsp;j++)<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>((mask&nbsp;&amp;&nbsp;(1&lt;&lt;i))&nbsp;&amp;&amp;&nbsp;!(mask&nbsp;&amp;&nbsp;(1&nbsp;&lt;&lt;&nbsp;j))&nbsp;&amp;&amp;&nbsp;maz[i][j]&nbsp;!=&nbsp;-1&nbsp;&amp;&amp;&nbsp;(mask&nbsp;&amp;&nbsp;limit[j])&nbsp;==&nbsp;limit[j])<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[j][mask|(1&lt;&lt;j)]&nbsp;=&nbsp;min(dp[j][mask|(1&lt;&lt;j)],&nbsp;dp[i][mask]&nbsp;+&nbsp;maz[i][j]);<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;=&nbsp;min(ans,&nbsp;dp[i][(1&lt;&lt;n)-1]);<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;(ans&nbsp;==&nbsp;inf)&nbsp;?&nbsp;-1&nbsp;:&nbsp;ans);<br /><span style="color: #008080; ">42</span>&nbsp;}<br /><span style="color: #008080; ">43</span>&nbsp;<br /><span style="color: #008080; ">44</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d",&nbsp;&amp;n,&nbsp;&amp;m))&nbsp;{<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(limit,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(limit));<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;n;&nbsp;j++)<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;maz[i][j]);<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;m;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;u,&nbsp;&amp;v);<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;limit[v]&nbsp;|=&nbsp;(1&lt;&lt;u);<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">58</span>&nbsp;}<br /><span style="color: #008080; ">59</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/168857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-03-25 02:11 <a href="http://www.cppblog.com/y346491470/articles/168857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 1797 Heavy Transportation - 最短路 + dp</title><link>http://www.cppblog.com/y346491470/articles/167414.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Thu, 08 Mar 2012 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/167414.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/167414.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/167414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/167414.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/167414.html</trackback:ping><description><![CDATA[<div>【题意】：求城市1到城市n可行路径上最小值的最大值。<br /><br />【题解】：最短路变形，加上一点dp思想。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;把dist[]数组存储的东西改一下即可。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;1050<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;30;<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m;<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maz[maxn][maxn];<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dist[maxn];<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;visit[maxn];<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;prim(<span style="color: #0000FF; ">int</span>&nbsp;s)&nbsp;{<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(visit,&nbsp;<span style="color: #0000FF; ">false</span>,&nbsp;<span style="color: #0000FF; ">sizeof</span>(visit));<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(dist,&nbsp;-1,&nbsp;<span style="color: #0000FF; ">sizeof</span>(dist));<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[s]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(1)&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u&nbsp;=&nbsp;-1;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!visit[i]&nbsp;&amp;&amp;&nbsp;(u&nbsp;==&nbsp;-1&nbsp;||&nbsp;dist[i]&nbsp;&gt;&nbsp;dist[u]))&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;=&nbsp;i;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(u&nbsp;==&nbsp;-1)&nbsp;<span style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[u]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!visit[i]&nbsp;&amp;&amp;&nbsp;maz[u][i]&nbsp;!=&nbsp;-1)<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[i]&nbsp;=&nbsp;max(dist[i],&nbsp;min(dist[u],&nbsp;maz[u][i]));<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">40</span>&nbsp;}<br /><span style="color: #008080; ">41</span>&nbsp;<br /><span style="color: #008080; ">42</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;T,&nbsp;Case&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;w;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;T);<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(maz,&nbsp;-1,&nbsp;<span style="color: #0000FF; ">sizeof</span>(maz));<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;n,&nbsp;&amp;m);<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;m;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d",&nbsp;&amp;u,&nbsp;&amp;v,&nbsp;&amp;w);<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maz[u][v]&nbsp;=&nbsp;maz[v][u]&nbsp;=&nbsp;w;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prim(1);<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Scenario&nbsp;#%d:\n%d\n\n",&nbsp;Case++,&nbsp;dist[n]);<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">57</span>&nbsp;}<br /><span style="color: #008080; ">58</span>&nbsp;</div></div><img src ="http://www.cppblog.com/y346491470/aggbug/167414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-03-08 16:46 <a href="http://www.cppblog.com/y346491470/articles/167414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 1947 Rebuilding Roads - 树dp + 01背包 + 分组背包</title><link>http://www.cppblog.com/y346491470/articles/166569.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sun, 26 Feb 2012 08:36:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/166569.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/166569.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/166569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/166569.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/166569.html</trackback:ping><description><![CDATA[【题意】：给出一颗有n个节点的树，问你最少切割多少条边可以得出一棵子树刚好包含p个节点。<br /><br />【题解】：明显的树dp。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;做完这题突然发现我对树dp+背包的理解又加深了。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设dp[u][i]表示以u为根的子树，得到包含i个节点的树的最少代价。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dp[u][i] = min(dp[u][i] + 1, dp[u][i-j] + dp[v][j]),其中 1 &lt;= j &lt;= i，v 为 u 的儿子。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;枚举的时候注意要逆序，要不就开三维数组。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;155<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;25;<br /><span style="color: #008080; ">20</span>&nbsp;vector&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;vec[maxn];<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[maxn][maxn];<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;visit[maxn];<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;p;<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u)&nbsp;{<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;vec[u].size();<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill(&amp;dp[u][0],&nbsp;&amp;dp[u][maxn],&nbsp;inf);<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][1]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;vec[u][i];<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v);<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;p;&nbsp;j&nbsp;&gt;=&nbsp;1;&nbsp;j--)&nbsp;{<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j]++;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;1;&nbsp;k&nbsp;&lt;&nbsp;j;&nbsp;k++)&nbsp;{<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j]&nbsp;=&nbsp;min(dp[u][j],&nbsp;dp[u][j-k]&nbsp;+&nbsp;dp[v][k]);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;}<br /><span style="color: #008080; ">40</span>&nbsp;<br /><span style="color: #008080; ">41</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;root;<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d",&nbsp;&amp;n,&nbsp;&amp;p))&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(visit,&nbsp;<span style="color: #0000FF; ">true</span>,&nbsp;<span style="color: #0000FF; ">sizeof</span>(visit));<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;vec[i].clear();<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n&nbsp;-&nbsp;1;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;u,&nbsp;&amp;v);<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[u].pb(v);<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[v]&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(visit[i])&nbsp;root&nbsp;=&nbsp;i;<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(root);<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans&nbsp;=&nbsp;dp[root][p];<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;=&nbsp;min(ans,&nbsp;dp[i][p]&nbsp;+&nbsp;1);<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;ans&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">60</span>&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/166569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-02-26 16:36 <a href="http://www.cppblog.com/y346491470/articles/166569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CF 150A - 博弈 + 记忆化搜索</title><link>http://www.cppblog.com/y346491470/articles/165943.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sat, 18 Feb 2012 16:32:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/165943.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/165943.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/165943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/165943.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/165943.html</trackback:ping><description><![CDATA[【题意】：给出一个当前值q(q &lt;= 10^13)，两个人轮流写出一个当前值的非平凡因子来取代当前值，谁不能写谁胜出。一个数的非平凡因子是指除1和本身之外的因子。两个人都采取最优决策，问最后谁胜出。<br /><br />【题解】：博弈，直接记忆化搜索即可，只要搜到第一个必败态就可以跳出。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;利用map来处理可以把代码写得很短。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;MAX&nbsp;10000000<br /><span style="color: #008080; ">19</span>&nbsp;map&lt;ll,&nbsp;<span style="color: #0000FF; ">bool</span>&gt;&nbsp;win;<br /><span style="color: #008080; ">20</span>&nbsp;map&lt;ll,&nbsp;ll&gt;&nbsp;ans;<br /><span style="color: #008080; ">21</span>&nbsp;ll&nbsp;q;<br /><span style="color: #008080; ">22</span>&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;dfs(ll&nbsp;x)&nbsp;{<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(win.find(x)&nbsp;==&nbsp;win.end())&nbsp;{<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;isprime&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>,&nbsp;WIN&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans[x]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(ll&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;*&nbsp;i&nbsp;&lt;=&nbsp;x&nbsp;&amp;&amp;&nbsp;!WIN;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(x&nbsp;%&nbsp;i&nbsp;==&nbsp;0)&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isprime&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!dfs(i))&nbsp;WIN&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>,&nbsp;ans[x]&nbsp;=&nbsp;i;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(WIN)&nbsp;<span style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!dfs(x&nbsp;/&nbsp;i))&nbsp;WIN&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>,&nbsp;ans[x]&nbsp;=&nbsp;x&nbsp;/&nbsp;i;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;win[x]&nbsp;=&nbsp;WIN&nbsp;||&nbsp;isprime;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;win[x];<br /><span style="color: #008080; ">38</span>&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans.clear(),&nbsp;win.clear();<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(cin&nbsp;&gt;&gt;&nbsp;q)&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dfs(q))&nbsp;cout&nbsp;&lt;&lt;&nbsp;1&nbsp;&lt;&lt;&nbsp;endl&nbsp;&lt;&lt;&nbsp;ans[q]&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;cout&nbsp;&lt;&lt;&nbsp;2&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">47</span>&nbsp;}<br /><span style="color: #008080; ">48</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/165943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-02-19 00:32 <a href="http://www.cppblog.com/y346491470/articles/165943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 4159 Indomie - 概率dp</title><link>http://www.cppblog.com/y346491470/articles/165924.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sat, 18 Feb 2012 12:45:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/165924.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/165924.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/165924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/165924.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/165924.html</trackback:ping><description><![CDATA[<div style="text-align: left;">【题意】：有a,b,c三种物品，a和b有无限多件，c只有s件，现在Amjad<span style="font-family: 'Times New Roman'; line-height: normal; text-align: left; ">想拿</span>c<span style="font-family: 'Times New Roman'; line-height: normal; text-align: left; ">这个物品，但是他前面有n个人。现在每人轮流拿一个物品，前n个人是随机拿，而</span>Amjad是有目的性去拿，问Amjad取得c的概率是多少。</div><div>&nbsp;</div>【题解】：概率dp。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设dp[i][j]表示前 i 个人取完还有 j 个 C的概率。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;转移 ：dp[i][j] = dp[i-1][j] * 2 / 3 + dp[i-1][j+1] / 3;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;最后ans = ( &#8721;dp[n][i], 1 &lt;= i &lt;= s ) / (&nbsp;&#8721;dp[n][i], 0 &lt;= i &lt;= s)。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;实现时使用了滚动数组。<div>&nbsp;</div>【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;dp[60];<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;s;<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;sum;<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d",&nbsp;&amp;n,&nbsp;&amp;s))&nbsp;{<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(dp,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(dp));<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[s]&nbsp;=&nbsp;1.0,&nbsp;sum&nbsp;=&nbsp;0.0;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;=&nbsp;s;&nbsp;j++)<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[j]&nbsp;=&nbsp;dp[j]&nbsp;*&nbsp;2&nbsp;/&nbsp;3&nbsp;+&nbsp;dp[j+1]&nbsp;/&nbsp;3;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;=&nbsp;s;&nbsp;i++)&nbsp;sum&nbsp;+=&nbsp;dp[i];<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;ans&nbsp;=&nbsp;100.0&nbsp;*&nbsp;(sum&nbsp;-&nbsp;dp[0])&nbsp;/&nbsp;sum;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%.5f\n",&nbsp;ans);<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">33</span>&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/165924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-02-18 20:45 <a href="http://www.cppblog.com/y346491470/articles/165924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 4003 Find Metal Mineral - 树dp + 分组背包</title><link>http://www.cppblog.com/y346491470/articles/165490.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Mon, 13 Feb 2012 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/165490.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/165490.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/165490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/165490.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/165490.html</trackback:ping><description><![CDATA[【题意】：给出一棵树，每条边上有一个权值，表示通过这条边的代价。现在有k个机器人在节点s，问用k个机器人访问完整棵树的节点的最少代价是多少。<br /><br />【题解】：又是树dp+背包的题目。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设状态dp[u][k]表示以u为根节点的子树排了k个机器人下去访问完该子树的节点的最小代价。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;如果k == 0，表示排了一个机器人下去访问完之后机器人又返回到节点u。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;注意k == 0的时候必定是只有一个机器人下去然后返回，不会有多于一个机器人下去，因为这样肯定不是最优。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;然后就是一个01背包 +分组背包，枚举容量时要逆序，因为用了滚动数组。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pii&nbsp;pair&lt;int,&nbsp;int&gt;<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;mp&nbsp;make_pair<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;10050<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxm&nbsp;1000050<br /><span style="color: #008080; ">22</span>&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;s,&nbsp;cnt;<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;eh[maxn],&nbsp;tot;<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[maxn][15];<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Edge&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;w,&nbsp;next;<br /><span style="color: #008080; ">28</span>&nbsp;}et[maxm];<br /><span style="color: #008080; ">29</span>&nbsp;<br /><span style="color: #008080; ">30</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;addedge(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;w)&nbsp;{<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edge&nbsp;e&nbsp;=&nbsp;{u,&nbsp;v,&nbsp;w,&nbsp;eh[u]};<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;et[tot]&nbsp;=&nbsp;e;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eh[u]&nbsp;=&nbsp;tot++;<br /><span style="color: #008080; ">34</span>&nbsp;}<br /><span style="color: #008080; ">35</span>&nbsp;<br /><span style="color: #008080; ">36</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tot&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(eh,&nbsp;-1,&nbsp;<span style="color: #0000FF; ">sizeof</span>(eh));<br /><span style="color: #008080; ">39</span>&nbsp;}<br /><span style="color: #008080; ">40</span>&nbsp;<br /><span style="color: #008080; ">41</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fa)&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;eh[u];&nbsp;i&nbsp;!=&nbsp;-1;&nbsp;i&nbsp;=&nbsp;et[i].next)&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;et[i].v,&nbsp;w&nbsp;=&nbsp;et[i].w;<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v&nbsp;==&nbsp;fa)&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v,&nbsp;u);<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;cnt;&nbsp;j&nbsp;&gt;=&nbsp;0;&nbsp;j--)&nbsp;{<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j]&nbsp;+=&nbsp;dp[v][0]&nbsp;+&nbsp;2&nbsp;*&nbsp;w;<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;1;&nbsp;k&nbsp;&lt;=&nbsp;j;&nbsp;k++)&nbsp;{<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[u][j]&nbsp;=&nbsp;min(dp[u][j],&nbsp;dp[u][j-k]&nbsp;+&nbsp;dp[v][k]&nbsp;+&nbsp;k&nbsp;*&nbsp;w);<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">53</span>&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;<br /><span style="color: #008080; ">55</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;w;<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d%d",&nbsp;&amp;n,&nbsp;&amp;s,&nbsp;&amp;cnt))&nbsp;{<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(dp,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(dp));<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n&nbsp;-&nbsp;1;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d",&nbsp;&amp;u,&nbsp;&amp;v,&nbsp;&amp;w);<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addedge(u,&nbsp;v,&nbsp;w),&nbsp;addedge(v,&nbsp;u,&nbsp;w);<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(s,&nbsp;-1);<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;dp[s][cnt]);<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">68</span>&nbsp;}<br /><span style="color: #008080; ">69</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/165490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-02-13 15:42 <a href="http://www.cppblog.com/y346491470/articles/165490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CF 149D - 区间dp</title><link>http://www.cppblog.com/y346491470/articles/165484.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Mon, 13 Feb 2012 06:55:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/165484.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/165484.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/165484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/165484.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/165484.html</trackback:ping><description><![CDATA[【题意】：给出一个长度为n的括号序列，括号满足两两匹配。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;给出三个条件：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.每个括号可以不染色，染蓝色或者染红色；<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.匹配的括号对有且仅有一个染色；<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.相邻的括号不能染相同的颜色。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;问，满足以上三个条件的染色方案有多少种。<br /><br />【题解】：好明显的dp题，因为一般这种求方案数的题目如果用纯数学知识来解是解不出的，而且限制条件一大堆。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设状态dp[l][r][c1][c2]表示[l,r]之间且l染成c1,r染成c2的合法方案数。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;然后转移要分两种情况讨论：1.l与r匹配；2.l与r不匹配<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;转移就是运用乘法原理，要先预处理括号的匹配情况。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;"stack"<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;MAX&nbsp;710<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;MOD&nbsp;=&nbsp;1000000007;<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;str;<br /><span style="color: #008080; ">22</span>&nbsp;ll&nbsp;dp[MAX][MAX][3][3];<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;mat[MAX];<br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;s[MAX],&nbsp;top;<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;pretreatment()&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;str.length();&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(str[i]&nbsp;==&nbsp;'(')&nbsp;s[top++]&nbsp;=&nbsp;i;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;mat[s[--top]]&nbsp;=&nbsp;i;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">32</span>&nbsp;}<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;check(<span style="color: #0000FF; ">int</span>&nbsp;a,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b)&nbsp;{<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(a&nbsp;==&nbsp;0&nbsp;||&nbsp;b&nbsp;==&nbsp;0&nbsp;||&nbsp;a&nbsp;!=&nbsp;b)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">37</span>&nbsp;}<br /><span style="color: #008080; ">38</span>&nbsp;<br /><span style="color: #008080; ">39</span>&nbsp;ll&nbsp;func(<span style="color: #0000FF; ">int</span>&nbsp;l,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;r,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;c1,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;c2)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dp[l][r][c1][c2]&nbsp;!=&nbsp;-1)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;dp[l][r][c1][c2];<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ll&nbsp;res&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(mat[l]&nbsp;==&nbsp;r)&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>((c1&nbsp;==&nbsp;0)&nbsp;^&nbsp;(c2&nbsp;==&nbsp;0))&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(l&nbsp;+&nbsp;1&nbsp;==&nbsp;r)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;dp[l][r][c1][c2]&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;3;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;3;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(check(c1,&nbsp;i)&nbsp;&amp;&amp;&nbsp;check(j,&nbsp;c2))&nbsp;{<br /><span style="color: #008080; ">48</span>&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;res&nbsp;+=&nbsp;func(l&nbsp;+&nbsp;1,&nbsp;r&nbsp;-&nbsp;1,&nbsp;i,&nbsp;j);<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;dp[l][r][c1][c2]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;3;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;3;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(check(i,&nbsp;j))&nbsp;<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;+=&nbsp;func(l,&nbsp;mat[l],&nbsp;c1,&nbsp;i)&nbsp;*&nbsp;func(mat[l]&nbsp;+&nbsp;1,&nbsp;r,&nbsp;j,&nbsp;c2);<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;dp[l][r][c1][c2]&nbsp;=&nbsp;res&nbsp;%&nbsp;MOD;<br /><span style="color: #008080; ">62</span>&nbsp;}<br /><span style="color: #008080; ">63</span>&nbsp;<br /><span style="color: #008080; ">64</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(cin&nbsp;&gt;&gt;&nbsp;str)&nbsp;{<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pretreatment();<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(dp,&nbsp;-1,&nbsp;<span style="color: #0000FF; ">sizeof</span>(dp));<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ll&nbsp;ans&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;3;&nbsp;i++)<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;3;&nbsp;j++)<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;+=&nbsp;func(0,&nbsp;str.length()&nbsp;-&nbsp;1,&nbsp;i,&nbsp;j);<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;ans&nbsp;%&nbsp;MOD&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">75</span>&nbsp;}<br /><span style="color: #008080; ">76</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/165484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-02-13 14:55 <a href="http://www.cppblog.com/y346491470/articles/165484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zoj 1039 Number Game - 博弈 + 状态压缩 + 记忆化搜索</title><link>http://www.cppblog.com/y346491470/articles/165342.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Sat, 11 Feb 2012 06:21:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/165342.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/165342.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/165342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/165342.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/165342.html</trackback:ping><description><![CDATA[【题意】：两个人在玩数字游戏，规则如下：有2~20这19个数，每个回合每个人轮流取走一个数k，k取走后k的所有倍数都不可以再取，并且任意两个不可取的数的和也不可以取。给出当前的合法局面，问先手是否必胜，若必胜输出最优操作。<br /><br />【题解】：考虑到一共只有19个数字，可以用状态压缩。然后在博弈树上记忆化搜索即可，找到第一个必胜局面就可以跳出了。<br /><br />【代码】：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;MAX&nbsp;524287<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;x[20];<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dp[MAX+10];<br /><span style="color: #008080; ">21</span>&nbsp;vector&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;vec;<br /><span style="color: #008080; ">22</span>&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;getmask(<span style="color: #0000FF; ">int</span>&nbsp;&amp;tmp,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&amp;forbid,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x)&nbsp;{<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;x;&nbsp;i&nbsp;&lt;=&nbsp;20;&nbsp;i&nbsp;+=&nbsp;x)&nbsp;{<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(tmp&nbsp;&amp;&nbsp;(1&lt;&lt;(i-2)))&nbsp;{<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;&amp;=&nbsp;~(1&lt;&lt;(i-2));<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forbid&nbsp;|=&nbsp;(1&lt;&lt;(i-2));<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;=&nbsp;20;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(forbid&nbsp;&amp;&nbsp;(1&lt;&lt;(i-2)))<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i&nbsp;+&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;20&nbsp;-&nbsp;i;&nbsp;j++)&nbsp;{<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>((forbid&nbsp;&amp;&nbsp;(1&lt;&lt;(j-2)))&nbsp;&amp;&amp;&nbsp;(tmp&nbsp;&amp;&nbsp;(1&lt;&lt;(i+j-2))))&nbsp;{<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;&amp;=&nbsp;~(1&lt;&lt;(i+j-2)),&nbsp;forbid&nbsp;|=&nbsp;(1&lt;&lt;(i-2));<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">38</span>&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;g(<span style="color: #0000FF; ">int</span>&nbsp;mask,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;forbid)&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dp[mask]&nbsp;!=&nbsp;-1)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;dp[mask];<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;=&nbsp;20;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(mask&nbsp;&amp;&nbsp;(1&lt;&lt;(i-2)))&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nmask&nbsp;=&nbsp;mask,&nbsp;nforbid&nbsp;=&nbsp;forbid;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getmask(nmask,&nbsp;nforbid,&nbsp;i);<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!g(nmask,&nbsp;nforbid))&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;dp[mask]&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;dp[mask]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">50</span>&nbsp;}<br /><span style="color: #008080; ">51</span>&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(dp,&nbsp;-1,&nbsp;<span style="color: #0000FF; ">sizeof</span>(dp));<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[0]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">55</span>&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;<br /><span style="color: #008080; ">57</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;T,&nbsp;Case&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;T);<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec.clear();<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;n);<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;mask&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;x[i]);<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mask&nbsp;|=&nbsp;(1&lt;&lt;(x[i]-2));<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;forbid&nbsp;=&nbsp;MAX&nbsp;&amp;&nbsp;~mask;<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nmask&nbsp;=&nbsp;mask,&nbsp;nforbid&nbsp;=&nbsp;forbid;<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getmask(nmask,&nbsp;nforbid,&nbsp;x[i]);<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!g(nmask,&nbsp;nforbid))&nbsp;vec.pb(x[i]);<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Scenario&nbsp;#%d:\n",&nbsp;Case++);<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(vec.size())&nbsp;{<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(vec.begin(),&nbsp;vec.end());<br /><span style="color: #008080; ">78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("The&nbsp;winning&nbsp;moves&nbsp;are:");<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;vec.size();&nbsp;i++)&nbsp;printf("&nbsp;%d",&nbsp;vec[i]);<br /><span style="color: #008080; ">80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(".\n\n");<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;printf("There&nbsp;is&nbsp;no&nbsp;winning&nbsp;move.\n\n");<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">84</span>&nbsp;}<font color="#008080"><br /></font></div><img src ="http://www.cppblog.com/y346491470/aggbug/165342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-02-11 14:21 <a href="http://www.cppblog.com/y346491470/articles/165342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdoj 3507 Print Article - dp + 单调队列优化</title><link>http://www.cppblog.com/y346491470/articles/165128.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Tue, 07 Feb 2012 16:16:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/165128.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/165128.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/165128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/165128.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/165128.html</trackback:ping><description><![CDATA[【题意】：要打印一篇文章包含n个单词，每个单词打印需要一定的代价Ci。把连续k个单词打印在同一行需要花费(&#8721;Ci)^2 + M，问打印完整篇文章最少代价是多少。<br /><br />【题解】：一个分组问题，dp解决。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设dp[i]表示把前i个单词打印完的最少代价。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dp[i] = min(dp[j] + (sum[i] - sum[j]) ^ 2 + M),1 &lt;= j &lt;= i - 1.<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;朴素dp是O(n*n)，而n&lt;=500000，显然需要优化。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;这题满足决策的单调性，所以只需要用一个单调队列维护一个下凸线，这样可以把转移降为O(1)。<br /><br />【代码】：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;maxn&nbsp;500050<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m;<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;loc[maxn],&nbsp;head,&nbsp;tail;<br /><span style="color: #008080; ">20</span>&nbsp;ll&nbsp;sum[maxn],&nbsp;dp[maxn],&nbsp;cmp[maxn];<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d",&nbsp;&amp;n,&nbsp;&amp;m))&nbsp;{<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head&nbsp;=&nbsp;tail&nbsp;=&nbsp;0,&nbsp;sum[0]&nbsp;=&nbsp;0,&nbsp;dp[0]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loc[tail++]&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lld",&nbsp;&amp;sum[i]);<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum[i]&nbsp;+=&nbsp;sum[i-1];<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(head&nbsp;+&nbsp;1&nbsp;&lt;&nbsp;tail&nbsp;&amp;&amp;&nbsp;(cmp[loc[head+1]]&nbsp;-&nbsp;cmp[loc[head]])&nbsp;&lt;=&nbsp;2&nbsp;*&nbsp;sum[i]&nbsp;*&nbsp;(sum[loc[head+1]]&nbsp;-&nbsp;sum[loc[head]]))&nbsp;head++;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;loc[head];<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i]&nbsp;=&nbsp;dp[j]&nbsp;+&nbsp;(sum[i]&nbsp;-&nbsp;sum[j])&nbsp;*&nbsp;(sum[i]&nbsp;-&nbsp;sum[j])&nbsp;+&nbsp;m;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp[i]&nbsp;=&nbsp;dp[i]&nbsp;+&nbsp;sum[i]&nbsp;*&nbsp;sum[i];<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(head&nbsp;+&nbsp;1&nbsp;&lt;&nbsp;tail&nbsp;&amp;&amp;&nbsp;(cmp[loc[tail-1]]&nbsp;-&nbsp;cmp[loc[tail-2]])&nbsp;*&nbsp;(sum[i]&nbsp;-&nbsp;sum[loc[tail-1]])&nbsp;&gt;=&nbsp;(cmp[i]&nbsp;-&nbsp;cmp[loc[tail-1]])&nbsp;*&nbsp;(sum[loc[tail-1]]&nbsp;-&nbsp;sum[loc[tail-2]]))&nbsp;tail--;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loc[tail++]&nbsp;=&nbsp;i;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%lld\n",&nbsp;dp[n]);<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">40</span>&nbsp;}<br /><span style="color: #008080; ">41</span>&nbsp;</div><img src ="http://www.cppblog.com/y346491470/aggbug/165128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-02-08 00:16 <a href="http://www.cppblog.com/y346491470/articles/165128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 2094 The Mailboxes Manufacturers Problem - dp + 枚举最优测试点</title><link>http://www.cppblog.com/y346491470/articles/165064.html</link><dc:creator>y @ The Angry Teletubbies</dc:creator><author>y @ The Angry Teletubbies</author><pubDate>Mon, 06 Feb 2012 18:08:00 GMT</pubDate><guid>http://www.cppblog.com/y346491470/articles/165064.html</guid><wfw:comment>http://www.cppblog.com/y346491470/comments/165064.html</wfw:comment><comments>http://www.cppblog.com/y346491470/articles/165064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/y346491470/comments/commentRss/165064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/y346491470/services/trackbacks/165064.html</trackback:ping><description><![CDATA[<div>【题意】：给出k个邮筒，邮筒理论承受爆炸能力为m，实际上是[1,m]的某一个值。问，最坏情况下， 至少要用多少炸药才能测试出邮筒的承受爆炸能力。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;有几点要注意：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.如果邮筒可以承受x单位炸药，必定可以承受1到x-1单位的炸药。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.除非邮筒某次测试中被炸毁，否则仍然当它是完好无缺的，可以继续用于下一次测试。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />【题解】：dp。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于只有一个邮筒，我们只能由1,2,3,&#8230;&#8230;,m-1,m测试，所以最坏情况就是(1+m) * m / 2。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设状态dp[i][l][r] 表示当前还有 i 个邮筒，且承受能力在[l,r]内测试出承受爆炸能力所用的最少炸药。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;显然：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i == 1时，dp[1][l][r] = (l + r) * (r - l + 1) / 2.<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i &gt;= 2时，我们就不需要从头开始枚举了，我们应该选择一个最优的分界点去测试。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;所以有 dp[i][l][r] = min(dp[i][l][r], s + max(dp[i][s+1][r], dp[i-1][l][s-1])), l &lt;= s &lt;= r;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;这里说明一下，因为测试完点s之后，题目要求是最坏情况，所以只能选较大那个。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;而外层的min是指，在这么多分界点之中，我们选取最优的分界点，这样才能保证用最少炸药。<br /><div></div><br />【代码】：<br /><div style="padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; width: 1081px; word-break: break-all; "><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;"iostream"<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"cstdio"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;"cstring"<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;"algorithm"<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;"vector"<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#include&nbsp;"queue"<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;#include&nbsp;"cmath"<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;#include&nbsp;"string"<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;"cctype"<br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"map"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"iomanip"<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000ff; ">using</span>&nbsp;<span style="color: #0000ff; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000ff; ">#define</span>&nbsp;pb&nbsp;push_back<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000ff; ">#define</span>&nbsp;lc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1)<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000ff; ">#define</span>&nbsp;rc(x)&nbsp;(x&nbsp;&lt;&lt;&nbsp;1&nbsp;|&nbsp;1)<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000ff; ">#define</span>&nbsp;lowbit(x)&nbsp;(x&nbsp;&amp;&nbsp;(-x))<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000ff; ">#define</span>&nbsp;ll&nbsp;long&nbsp;long<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000ff; ">const</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;inf&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;30;<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;k,&nbsp;m;<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;dp[11][101][101];<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000ff; ">void</span>&nbsp;init_dp()&nbsp;{<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span>&nbsp;r&nbsp;=&nbsp;1;&nbsp;r&nbsp;&lt;=&nbsp;100;&nbsp;r++)<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span>&nbsp;l&nbsp;=&nbsp;1;&nbsp;l&nbsp;&lt;=&nbsp;r;&nbsp;l++)<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[1][l][r]&nbsp;=&nbsp;(l&nbsp;+&nbsp;r)&nbsp;*&nbsp;(r&nbsp;-&nbsp;l&nbsp;+&nbsp;1)&nbsp;/&nbsp;2;<br /><span style="color: #008080; ">26</span>&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span>&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;=&nbsp;10;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span>&nbsp;r&nbsp;=&nbsp;1;&nbsp;r&nbsp;&lt;=&nbsp;100;&nbsp;r++)&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span>&nbsp;l&nbsp;=&nbsp;r;&nbsp;l;&nbsp;l--)&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][l][r]&nbsp;=&nbsp;inf;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span>&nbsp;s&nbsp;=&nbsp;l;&nbsp;s&nbsp;&lt;=&nbsp;r;&nbsp;s++)&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i][l][r]&nbsp;=&nbsp;min(dp[i][l][r],&nbsp;s&nbsp;+&nbsp;max(dp[i][s+1][r],&nbsp;dp[i-1][l][s-1]));<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">36</span>&nbsp;}<br /><span style="color: #008080; ">37</span>&nbsp;<br /><span style="color: #008080; ">38</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;T;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;T);<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init_dp();<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">while</span>(T--)&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;k,&nbsp;&amp;m);<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;dp[k][1][m]);<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">47</span>&nbsp;}<br /><span style="color: #008080; ">48</span>&nbsp;</div></div><img src ="http://www.cppblog.com/y346491470/aggbug/165064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/y346491470/" target="_blank">y @ The Angry Teletubbies</a> 2012-02-07 02:08 <a href="http://www.cppblog.com/y346491470/articles/165064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>