﻿<?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++博客-I believe-随笔分类-动态规划</title><link>http://www.cppblog.com/luyulaile/category/10545.html</link><description>I  can</description><language>zh-cn</language><lastBuildDate>Thu, 04 Apr 2013 20:11:00 GMT</lastBuildDate><pubDate>Thu, 04 Apr 2013 20:11:00 GMT</pubDate><ttl>60</ttl><item><title>动态规划 解TSP 旅行商问题 经典实现 </title><link>http://www.cppblog.com/luyulaile/archive/2013/03/31/198974.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sat, 30 Mar 2013 21:26:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2013/03/31/198974.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/198974.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2013/03/31/198974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/198974.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/198974.html</trackback:ping><description><![CDATA[<h1><span style="color: #333333; font-family: Arial; font-size: 14px; font-weight: normal; line-height: 26px;">原文地址: http://blog.csdn.net/gfaiswl/article/details/4749713</span><br /><br />1.问题定义</h1><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TSP问题（旅行商问题）是指旅行家要旅行n个城市，要求各个城市经历且仅经历一次然后回到出发城市，并要求所走的路程最短。</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假设现在有四个城市，0,1,2,3，他们之间的代价如图一，可以存成二维表的形式<br /><div></div></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_2.png" style="margin: 0px; padding: 0px; color: #336699; text-decoration: initial;"><img title="image" src="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_thumb.png" border="0" alt="image" width="244" height="237" style="margin: 0px; padding: 0px; border: 0px none; display: inline;" /></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_4.gif" style="margin: 0px; padding: 0px; color: #336699; text-decoration: initial;"><img title="image" src="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_thumb_1.gif" border="0" alt="image" width="240" height="187" style="margin: 0px; padding: 0px; border: 0px none; display: inline;" /></a></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图一&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在要从城市0出发，最后又回到0，期间1，2，3都必须并且只能经过一次，使代价最小。</p><h1><a name="t1" style="margin: 0px; padding: 0px; color: rgb(51, 102, 153);"></a>2.动态规划可行性</h1><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设s, s1, s2, &#8230;, sp, s是从s出发的一条路径长度最短的简单回路，假设从s到下一个城市s1已经求出，则问题转化为求从s1到s的最短路径，显然s1, s2, &#8230;, sp, s一定构成一条从s1到s的最短路径，所以TSP问题是构成最优子结构性质的，用动态规划来求解也是合理的。</p><h1><a name="t2" style="margin: 0px; padding: 0px; color: rgb(51, 102, 153);"></a>3.推导动态规划方程</h1><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假设从顶点s出发，令d(i, V&#8217;)表示从顶点i出发经过V&#8217;(是一个点的集合)中各个顶点一次且仅一次，最后回到出发点s的最短路径长度。</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 推导：(分情况来讨论)</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9312;当V&#8217;为空集，那么d(i, V&#8217;)，表示从i不经过任何点就回到s了，如上图的 城市3-&gt;城市0(0为起点城市)。此时d(i, V&#8217;)=Cis(就是 城市i 到 城市s 的距离)、</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9313;如果V&#8217;不为空，那么就是对子问题的最优求解。你必须在V&#8217;这个城市集合中，尝试每一个，并求出最优解。</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d(i, V&#8217;)=min{Cik +&nbsp; d(k, V&#8217;-{k})}</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：Cik表示你选择的城市和城市i的距离，d(k, V&#8217;-{k})是一个子问题。</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 综上所述，TSP问题的动态规划方程就出来了：</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_6.gif" style="margin: 0px; padding: 0px; color: #336699; text-decoration: initial;"><img title="image" src="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_thumb_2.gif" border="0" alt="image" width="369" height="70" style="margin: 0px; padding: 0px; border: 0px none; display: inline;" /></a></p><h1><a name="t3" style="margin: 0px; padding: 0px; color: rgb(51, 102, 153);"></a>4.实例分析</h1><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp; 现在对问题定义中的例子来说明TSP的求解过程。(假设出发城市是 0城市)</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_8.gif" style="margin: 0px; padding: 0px; color: #336699; text-decoration: initial;"><img title="image" src="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_thumb_3.gif" border="0" alt="image" width="534" height="226" style="margin: 0px; padding: 0px; border: 0px none; display: inline;" /></a></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; &#9312;我们要求的最终结果是d(0,{1,2,3}),它表示，从城市0开始，经过{1,2,3}之中的城市并且只有一次，求出最短路径.</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; &#9313;d(0,{1,2,3})是不能一下子求出来的，那么他的值是怎么得出的呢？看上图的第二层，第二层表明了d(0,{1,2,3})所需依赖的值。那么得出：</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d(0,{1,2,3})=min&nbsp; {</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C01+d(1,{2,3})</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C02+d{2,{1,3}}</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C03+d{3,{1,2}}</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&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; }</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp; &#9314;d(1,{2,3})，d(2,{1,3})，d(3,{1,2})同样也不是一步就能求出来的，它们的解一样需要有依赖，就比如说d(1,{2,3})</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d(1,{2,3})=min{</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&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; C12+d(2,{3})&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;</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&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; C13+d(3,{2})</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&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; }</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d(2,{1,3})，d(3,{1,2})同样需要这么求。</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; &#9315;按照上面的思路，只有最后一层的，当当V&#8217;为空集时，Cis的值才可以求，它的值是直接从</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;"><a href="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_4.gif" style="margin: 0px; padding: 0px; color: #336699; text-decoration: initial;"><img title="image" src="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_thumb_1.gif" border="0" alt="image" width="240" height="187" style="margin: 0px; padding: 0px; border: 0px none; display: inline;" /></a></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">这张表里求得的。</p><h1><a name="t4" style="margin: 0px; padding: 0px; color: rgb(51, 102, 153);"></a>&nbsp;&nbsp;&nbsp;&nbsp; 5.编程思路</h1><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将d(i, V&#8217;)转换成二维表，d[i][j]</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;"><a href="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_4.png" style="margin: 0px; padding: 0px; color: #336699; text-decoration: initial;"><img title="image" src="http://p.blog.csdn.net/images/p_blog_csdn_net/gfaiswl/612517/o_image_thumb_1.png" border="0" alt="image" width="519" height="159" style="margin: 0px; padding: 0px; border: 0px none; display: inline;" /></a></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在程序中模拟填表的过程，主要要考虑到j这个参数的表示，它要代表一个集合，可以用二维数组来表示。</p><h1><a name="t5" style="margin: 0px; padding: 0px; color: rgb(51, 102, 153);"></a>&nbsp;&nbsp; 6.源代码</h1><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">注：由于本人水平有限，并且主要在这里是体现思路，所以程序并不是很完善，代码质量也不高，很地方可以写得通用一些，所以这里只是提供一个参考，程序的进一步完善，由读者自由发挥。</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">#include&nbsp;<br style="margin: 0px; padding: 0px;" />#include</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">int IsIncluded(int x,int array[3])//x是否包含在数组中&nbsp;<br style="margin: 0px; padding: 0px;" />{&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; if((array[0] != x) &amp;&amp; (array[1] != x) &amp;&amp; (array[2] != x))&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; return 1;&nbsp;<br style="margin: 0px; padding: 0px;" />}&nbsp;<br style="margin: 0px; padding: 0px;" />int Left(int k,int array[3],int V[8][3])//实现V'-{k} 的下标检索&nbsp;<br style="margin: 0px; padding: 0px;" />{&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; int i = 0,index = 0,array_0_count = 0,array_1_count = 0,array_2_count = 0,array_3_count = 0;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; int V_0_count = 0,V_1_count = 0,V_2_count = 0,V_3_count = 0;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; int temp[3];&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; for(i = 0; i &lt; 3; i++)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp[i] = array[i];&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; for(i = 0; i &lt; 3; i++)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(temp[i] == k)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp[i] = 0;&nbsp; //相当于去掉k这个城市&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; for(i = 0; i &lt; 3; i++)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; {&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(temp[i] == 0)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array_0_count++;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(temp[i] == 1)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array_1_count++;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(temp[i] == 2)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array_2_count++;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array_3_count++;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; }&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; for(index = 0; index &lt; 8; index++)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; {&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0; i &lt; 3; i++)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(V[index][i] == 0)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V_0_count++;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(V[index][i] == 1)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V_1_count++;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(V[index][i] == 2)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V_2_count++;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V_3_count++;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((array_0_count == V_0_count) &amp;&amp; (array_1_count == V_1_count)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (array_2_count == V_2_count) &amp;&amp; (array_3_count == V_3_count))&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return index;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V_0_count = 0;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V_1_count = 0;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V_2_count = 0;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V_3_count = 0;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; }&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; return 0;&nbsp;<br style="margin: 0px; padding: 0px;" />}</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">void TSP(int d[4][8],int c[4][4],int V[8][3],int n)&nbsp;<br style="margin: 0px; padding: 0px;" />{&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; int i = 0,j = 0,k = 0;</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; for(i = 1; i &lt; n; i++)//V'为空时，给赋值，&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d[i][0] = c[i][0];</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; for(j = 1; j &lt; 7; j++)//按列遍历不同集合，{1},{2},{3},{1,2},{1,3}.....&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; {&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i = 1; i &lt; n; i++)//遍历城市1，2，3&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !IsIncluded(i,V[j]) )//i必须不在集合中，否则就属于经过两次，不符合题意&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k = 0; k &lt; 3; k++)//分别试探集合中的每一点，取最小值&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((V[j][k] != 0) &amp;&amp; ((c[i][V[j][k]] + d[V[j][k]][Left(V[j][k],V[j],V)]) &lt; d[i][j]))&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d[i][j] = c[i][V[j][k]] + d[V[j][k]][Left(V[j][k],V[j],V)];&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end of&nbsp;&nbsp;&nbsp;&nbsp; for(i = 1; i &lt; n; i++)//遍历城市1，2，3&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; }//end of for(j = 1; j &lt; ((int)pow(2,n)-1); j++)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; for(k = 0; k &lt; 3; k++)//分别试探下一步为集合中的任何一点，取最小值&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; {&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((V[7][k] != 0) &amp;&amp; (c[0][V[7][k]] + d[V[7][k]][Left(V[7][k],V[7],V)]) &lt; d[0][7])&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d[0][7] = c[0][V[7][k]] + d[V[7][k]][Left(V[7][k],V[7],V)];&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; }&nbsp;<br style="margin: 0px; padding: 0px;" />}&nbsp;<br style="margin: 0px; padding: 0px;" />void main()&nbsp;<br style="margin: 0px; padding: 0px;" />{&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; int V[8][3]=&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; {&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,0,0,&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,0,1,&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,0,2,&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,0,3,&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,1,2,&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,1,3,&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,2,3,&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,2,3&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; };&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; int c[4][4]=&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; {&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,3,6,7,&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5,0,2,3,&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6,4,0,2,&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,7,5,0&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; };&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; int d[4][8]={0},i=0,j=0;</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; for(i=0; i&lt;4; i++)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0; j&lt;8; j++)&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d[i][j]=1000;&nbsp;&nbsp; //假设1000为无穷大&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; TSP(d,c,V,4);&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; printf("The least road is:%d/n",d[0][7]);&nbsp;<br style="margin: 0px; padding: 0px;" />}</p><img src ="http://www.cppblog.com/luyulaile/aggbug/198974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2013-03-31 05:26 <a href="http://www.cppblog.com/luyulaile/archive/2013/03/31/198974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1815 The Smart Bunny 动态规划 详解</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/20/90642.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Mon, 20 Jul 2009 09:19:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/20/90642.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/90642.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/20/90642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/90642.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/90642.html</trackback:ping><description><![CDATA[<div class=prob_text style="FONT-SIZE: 8pt">
<p><em>2<sup>nd</sup> JOJ Cup Online VContest Problem</em></p>
<p>We all know that bunny is fond of carrots. One cloudy day, he was told that there would be a violenting flood coming soon to destroy the forests. He&nbsp;was scared and&nbsp;after not thinking too much&nbsp;he told himself that he had to escape. He suddenly recalled that there was a temple on the top of the hill and he might shelter there until the flood's past. But unfortunately there was no food for him on the top of the hill, so he had to take his carrots away along with himself. Then he moved to the foot of the hill and stopped. There was only one way for him to get the top of the hill, that is, a long staircase. Given the number of the steps of the staircase, he asked himself:"how many different ways&nbsp;of strides are there for him to get the top of the hill?". Of course, because of his height, he could only stride a limited range of steps. He was smart so much so that he got the answer quickly. Do you know how he did it?</p>
<p><strong>Input Specification</strong></p>
<p>The input consists of several test cases, each of which occupies a line containing M(1&lt;=M&lt;=40) and N(1&lt;=N&lt;=10), where M indicates the number of the steps of the staircase and N indicates the maximal number of steps the bunny can stride once.</p>
<p><strong>Output Specification</strong></p>
<p>Each test case should correspond to a line in the output. Your program should print an integer which is the answer.</p>
<p><strong>Sample Input</strong></p>
<p>4 2<br>5 4</p>
<p><strong>Sample Output</strong></p>
<p>5<br>15<br><br><br>题意是一只兔子要到距离为M（单位为1）的地方，它每步最多走N，问有多少种方法。输入M&nbsp; N 输出r[m][n];</p>
<br><span style="FONT-SIZE: 12pt">解析：设为r[i][j]，表示距离总共i且每次最多走j的方法数(可以没有走出那大小为j的那步，只是允许走那步而已)。<br><br>根据最后那一步可能走的长度，r[i-2][j]表示最后那步距离为2.r[i-j][j]表示最后那步距离为j.<br>建立递推关系r[i][j]=r[i-1][j]+r[i-2][j]+r[i-3][j]+r[i-j][j];<br>//本人觉得这里特别难想，想到了也觉得无法建立递推关系呀，j不是一直不变吗？<br>神奇的地方在于可以令r[0][j]=r[1][j]=1;当然还有r[i][1]=1<br>-----------预处理----<br>for(j=0;j&lt;n;j++)
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>{</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r</span>[0][j]=1;</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r</span>[1][j]=1;</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>}</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>for(i=0;i&lt;n;i++)</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r</span>[i][1]=1;</font></span></p>
<br>---dp----------<br>&nbsp;for(i=2;i&lt;m;i++)<br>&nbsp;&nbsp;&nbsp; for(j=2;j&lt;n;j++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; if(i&lt;j)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r[i][j]=r[i][i]; //这点非常重要<br>&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=1;k&lt;=j;k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp; r[i][j]+=r[i-k][j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>------------<br>r[1][1]=1<br>r[2][1]=1<br>r[2][2]=r[2][1]+r[2][2]=2;<br>r[3][1]=1;<br>r[3][2]=r[2][2]+r[1][2]=3;<br>r[3][3]=r[0][3]+r[1][3]+r[2][3]=4;<br></span><br></div>
<img src ="http://www.cppblog.com/luyulaile/aggbug/90642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-20 17:19 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/20/90642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1762 Dollars  动态规划 详解</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/19/90547.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sun, 19 Jul 2009 13:45:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/19/90547.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/90547.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/19/90547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/90547.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/90547.html</trackback:ping><description><![CDATA[<p>New Zealand currency consists of $100, $50, $20, $10, and $5 notes and $2, $1, 50c, 20c, 10c and 5c coins. Write a program that will determine, for any given amount, in how many ways that amount may be made up. Changing the order of listing does not increase the count. Thus 20c may be made up in 4 ways: 1 <img height=18 src="http://acm.jlu.edu.cn/joj/images/problems/1762_1.gif" width=9 align=middle> 20c, 2 <img height=18 src="http://acm.jlu.edu.cn/joj/images/problems/1762_1.gif" width=9 align=middle> 10c, 10c+2 <img height=18 src="http://acm.jlu.edu.cn/joj/images/problems/1762_1.gif" width=9 align=middle> 5c, and 4 <img height=18 src="http://acm.jlu.edu.cn/joj/images/problems/1762_1.gif" width=9 align=middle> 5c.</p>
<p><strong>Input</strong></p>
<p>Input will consist of a series of real numbers no greater than $50.00 each on a separate line. Each amount will be valid, that is will be a multiple of 5c. The file will be terminated by a line containing zero (0.00).</p>
<p><strong>Output</strong></p>
<p>Output will consist of a line for each of the amounts in the input, each line consisting of the amount of money (with two decimal places and right justified in a field of width 5), followed by the number of ways in which that amount may be made up, right justified in a field of width 12.</p>
<p><strong>Sample input</strong></p>
<p>&nbsp;</p>
<pre>0.20
2.00
0.00</pre>
<p><strong>Sample output</strong></p>
<p>&nbsp;</p>
<pre>0.20           4
2.00         293</pre>
<pre>典型的动态规划问题：</pre>
<pre>可以先考虑只有n-1种硬币，V1,V2,V3,---Vn-1.设凑成总值为M的方法数为result[M];</pre>
<pre>现在又添加一种面值为Vn的硬币。</pre>
<pre>则咱们需要修改一些值，修改那些大于等于Vn的result[],不妨设M大于vn。</pre>
<pre>新result[M]=原result[M]+result[M-Vn]+result[M-2*Vn]+----直到M-p*Vn&lt;=0;（1）</pre>
<pre>实际上如果如<span style="COLOR: red">(2)那样处理 </span>从大于等于Vn的result[]开始处理的话，从小到大，设Vn=M-p*Vn;</pre>
<pre>则result[M-p*Vn]第一个最先更新，result[M-p*Vn]+=result[M-p*Vn -Vn]   见<span style="COLOR: red">(2)<br></span>随后更新result[M-(p-1)*vn]，则只需直接加上result[M-p*Vn]的值，无需如（1）式那样  累加。</pre>
<pre>用程序表达就是</pre>
<pre>int coin[10]={5,10,20,50,100,200,500,1000,2000,5000};</pre>
<pre>for(i=1;i&lt;10;i++)</pre>
<pre> for(j=coin[i];j&lt;=50000;j+=5)</pre>
<pre>     result[j]+=result[j-Coin[i]];   <span style="COLOR: red">(2)</span> //</pre>
<pre>-------------</pre>
<pre>还有一个注意点，见牛人博客，<a href="http://hi.baidu.com/piaoshi111/blog/item/9a6de84a00a6e5f882025c89.html">http://hi.baidu.com/piaoshi111/blog/item/9a6de84a00a6e5f882025c89.html</a></pre>
<pre>就是浮点数的四舍五入，</pre>
<pre>1.5，浮点数可能表为1.4999999，所以乘以100时转化为整型是149，应当注意。</pre>
<img src ="http://www.cppblog.com/luyulaile/aggbug/90547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-19 21:45 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/19/90547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1832  Little Shop of Flowers</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/14/89995.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Tue, 14 Jul 2009 02:05:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/14/89995.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/89995.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/14/89995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/89995.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/89995.html</trackback:ping><description><![CDATA[<div class=prob_text>
<p>You want to arrange the window of your flower shop in a most pleasant way. You have F bunches of flowers, each being of a different kind, and at least as many vases ordered in a row. The vases are glued onto the shelf and are numbered consecutively 1 through V, where V is the number of vases, from left to right so that the vase 1 is the leftmost, and the vase V is the rightmost vase. The bunches are moveable and are uniquely identified by integers between 1 and F. These id-numbers have a significance: They determine the required order of appearance of the flower bunches in the row of vases so that the bunch i must be in a vase to the left of the vase containing bunch j whenever i &lt; j. Suppose, for example, you have bunch of azaleas (id-number=1), a bunch of begonias (id-number=2) and a bunch of carnations (id-number=3). Now, all the bunches must be put into the vases keeping their id-numbers in order. The bunch of azaleas must be in a vase to the left of begonias, and the bunch of begonias must be in a vase to the left of carnations. If there are more vases than bunches of flowers then the excess will be left empty. A vase can hold only one bunch of flowers. </p>
<p>Each vase has a distinct characteristic (just like flowers do). Hence, putting a bunch of flowers in a vase results in a certain aesthetic value, expressed by an integer. The aesthetic values are presented in a table as shown below. Leaving a vase empty has an aesthetic value of 0. </p>
<div align=center>
<table class=MsoNormalTable style="BORDER-RIGHT: black 1pt outset; BORDER-TOP: black 1pt outset; BORDER-LEFT: black 1pt outset; WIDTH: 90%; BORDER-BOTTOM: black 1pt outset" cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 6%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset" vAlign=top width="6%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">&nbsp;</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 35%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset" vAlign=top width="35%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">&nbsp;</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 59%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset" vAlign=top width="59%" colSpan=5>
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">V A S E S</span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 6%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset" vAlign=top width="6%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">&nbsp;</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 35%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset" vAlign=top width="35%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">&nbsp;</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 13%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset" vAlign=top width="13%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">1</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset" vAlign=top width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">2</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset" vAlign=top width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">3</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 13%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset" vAlign=top width="13%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">4</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset" vAlign=top width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">5</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 19.5pt; page-break-inside: avoid">
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 6%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="6%" rowSpan=3>
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">Bunches</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 35%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="35%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">1 (azaleas)</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 13%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="13%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">7</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">23</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">-5</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 13%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="13%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">-24</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">16</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 19.5pt; page-break-inside: avoid">
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 35%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="35%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">2 (begonias)</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 13%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="13%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">5</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">21</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">-4</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 13%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="13%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">10</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">23</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 19.5pt; page-break-inside: avoid">
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 35%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="35%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">3 (carnations)</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 13%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="13%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">-21</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">5</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">-4</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 13%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="13%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">-20</span></p>
            </td>
            <td style="BORDER-RIGHT: black 1pt inset; PADDING-RIGHT: 5.25pt; BORDER-TOP: black 1pt inset; PADDING-LEFT: 5.25pt; PADDING-BOTTOM: 5.25pt; BORDER-LEFT: black 1pt inset; WIDTH: 11%; PADDING-TOP: 5.25pt; BORDER-BOTTOM: black 1pt inset; HEIGHT: 19.5pt" width="11%">
            <p class=MsoNormal style="LINE-HEIGHT: normal"><span lang=EN-US style="FONT-FAMILY: Verdana">20</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>&#160;</p>
<p>According to the table, azaleas, for example, would look great in vase 2, but they would look awful in vase 4. </p>
<p>To achieve the most pleasant effect you have to maximize the sum of aesthetic values for the arrangement while keeping the required ordering of the flowers. </p>
<p><strong>ASSUMPTIONS </strong></p>
<p>1 &#8804; F &#8804; 100 where F is the number of the bunches of flowers. The bunches are numbered 1 through F. F &#8804; V &#8804; 100 where V is the number of vases. -50 &#8804; Aij &#8804; 50 where Aij is the aesthetic value obtained by putting the flower bunch i into the vase j. </p>
<p><strong>Input </strong></p>
<p>The first line contains two numbers: F and V. </p>
<p>The following F lines: Each of these lines contains V integers, so that Aij is given as the j&#8217;th number on the (i+1)&#8217;st line of the input file. </p>
<p>Notice: The input contains several test cases. </p>
<p><strong>Output </strong></p>
<p>The output line will contain the sum of aesthetic values for your arrangement. </p>
<p><strong>Sample Input </strong></p>
<p>3 5<br>7 23 -5 -24 16<br>5 21 -4 10 23<br>-21 5 -4 -20 20</p>
<p><strong>Sample Output </strong></p>
<p>53</p>
</div>
这题可以用搜索过，但是还可以用dp<br>用result[i][j]表示前i行，以j结尾的排法的最大值，<br>rsult[1][j]直接初始化为num[i][j];其余初始化为负无穷<br>dp的过程就是<br>&nbsp;&nbsp;&nbsp; for(i=2;i&lt;-r;i++)//行逐渐增加<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=i;j&lt;=c;j++)//列必须大于等于行号，否则无法保证从左上方到右下方<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(k=1;k&lt;j;k++)<br>&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; if(result[i][j]&lt;result[i-1][k]+num[i][j])//无需担心不是从左上方到右下方，因为若i&lt;j，result[][]赋为了负无穷<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result[i][j]=result[i-1][k]+num[i][j]<br>更详细的代码可以到苏强的博客<span><a href="http://download.csdn.net/user/china8848/"><font color=#336699>http://download.csdn.net/user/china8848/</font></a>获得</span>
<img src ="http://www.cppblog.com/luyulaile/aggbug/89995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-14 10:05 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/14/89995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 1631 Bridging signals 经典dp 时间复杂度nlogn</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/12/89869.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sun, 12 Jul 2009 07:46:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/12/89869.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/89869.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/12/89869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/89869.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/89869.html</trackback:ping><description><![CDATA[题意就是求最长上升子序列，且必须用nlogn的dp算法。<br>
<p style="FONT-FAMILY: 宋体">技巧：设置一个数组a[i]</p>
<p style="FONT-FAMILY: 宋体">存放所有长度为i的上升子序列中最小的末元素值，比如说只有两个长度为3的上升子序列123和124，那么a[3]中存放的就是3（末元素3&lt;4）</p>
<p style="FONT-FAMILY: 宋体">那么当来一个新数data时，如果它的值大于最长长度的末元素的值（即a[ans]），则ans++；且a[ans]=data;</p>
<p style="FONT-FAMILY: 宋体">否则，通过二分查找（数组a中的元素为递增），将最接近data且大于data的那个元素更新为data，既最小的大于它的数。<br>例如1,5,3,4,之后来个2，a[1]=1,a[2]=3,a[3]=4;则更新a[2]=2;<br>由于二分查找复杂度为log(n)，外围为n,总的复杂度为nlogn</p>
代码。
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;res[</span><span style="COLOR: #000000">40000</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;binSearch(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;left,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;right,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">找到最小的大于等于它的数&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(left&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(left&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;right)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(res[mid]</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">num)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">mid</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">mid</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;right;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">freopen("s.txt","r",stdin);<br>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;freopen("key.txt","w",stdout);</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;t,&nbsp;n,&nbsp;num;<br>&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">t);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(t</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">n,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">num);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">num;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;tot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">n;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">num);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(num</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">res[tot</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res[tot</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">num;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;pos</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">binSearch(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,tot</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,num);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">找到最小的大于它的数&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res[pos</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;num;<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;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;tot);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br></span></div>
<img src ="http://www.cppblog.com/luyulaile/aggbug/89869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-12 15:46 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/12/89869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1092 To the Max 转帖Dp经典</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/09/89674.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Thu, 09 Jul 2009 10:37:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/09/89674.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/89674.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/09/89674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/89674.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/89674.html</trackback:ping><description><![CDATA[<div class=tit>[原创]POJ1050 To the Max 解题报告</div>
<div class=date>2006-04-17 11:55</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text>
            <div class="sysBr500 text" align=left>题目大意:<br><br>读入一个n*n的数组,比如&nbsp;<br><br>0&nbsp;-2&nbsp;-7&nbsp;0&nbsp;<br><br>9&nbsp;2&nbsp;-6&nbsp;2&nbsp;<br><br>-4&nbsp;1&nbsp;-4&nbsp;1&nbsp;<br><br>-1&nbsp;8&nbsp;0&nbsp;-2&nbsp;&nbsp;<br><br>从里面任意截取一个矩阵,使得矩阵所包含的数字的和最大.<br><br>截取出来的矩阵,和为15<br><br>9&nbsp;2&nbsp;<br><br>-4&nbsp;1&nbsp;<br><br>-1&nbsp;8&nbsp;<br><br>---------------------------------------------------------<br><br>POJ&nbsp;1050&nbsp;我的解题报告：<br><br>这个题目很经典的说，O（N^3）的DP。<br><br>首先偶们考察这样的题目，简化版：<br><br>已知一列数，求任意连续若干个数和的最大值。<br><br>SAMPLE：&nbsp;3&nbsp;2&nbsp;-6&nbsp;2&nbsp;-1&nbsp;7<br><br>原数3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;<br><br>处理3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8<br><br>因为是连续若干个自然数的和，那么，前面的某个数字取与不取的条件在于：以前面这个数字为结尾的连续数的和最大值是否大于0，如果大于0，那么这个数字必然要会出现在包括数字的序列中，否则无法做到最大。<br><br>所以，显然。处理的原则是maxn[i]=max{0,maxn[i-1]}+a[i];<br><br>由于无须记录位置。所以，可以直接用一个变量sum代替maxn数组。O(n)的扫描即可。<br><br>单列数字的问题解决了，下面我们考察多列数字的<br><br>sample:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;-2&nbsp;&nbsp;&nbsp;&nbsp;-7&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;-6&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;-4&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;-2&nbsp;<br><br><br><br>我们可以将多列数字转换成单列数字来做！&nbsp;可以这样设想，结果是一个长方形，我们把他压扁，使得宽为1。<br><br>引入辅助数组st,st[i][j]代表第i列从第1行开始的数字累加到第j行的值。那么，我们每次压扁的时候，就可以用st[i][j]-st[i][k-1]来表示第i列从第k个数字累加到第j个数字的值。达到压缩的效果。然后用上面单列数字的方法来做。算法时间复杂度O&nbsp;(N^3) <br><br>Source<br><br><br><br>Problem&nbsp;Id:1050&nbsp;&nbsp;User&nbsp;Id:galaxy&nbsp;<br><br>Memory:112K&nbsp;&nbsp;Time:0MS<br><br>Language:G++&nbsp;&nbsp;Result:Accepted<br><br><br><br>/*<br><br>&nbsp;&nbsp;Name:POJ&nbsp;1050&nbsp;<br><br>&nbsp;&nbsp;Copyright:&nbsp;flymouse@galaxy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;Author:chenlei<br><br>&nbsp;&nbsp;Date:&nbsp;15-02-06&nbsp;07:36<br><br>&nbsp;&nbsp;Description:&nbsp;DP&nbsp;O(N^3)<br><br>*/<br><br>#include&nbsp;&lt;stdio.h&gt;<br><br>#include&nbsp;&lt;string.h&gt;<br><br>#define&nbsp;mt&nbsp;101<br><br>int&nbsp;main()<br><br>{<br><br>int&nbsp;a[mt][mt];<br><br>int&nbsp;st[mt][mt];<br><br>int&nbsp;p,k,n,i,j,sum,maxn;<br><br>//freopen("in.txt","r",stdin);<br><br>scanf("%d",&amp;n);<br><br>for&nbsp;(i=1;i&lt;=n;i++)<br><br>for&nbsp;(j=1;j&lt;=n;j++)<br><br>scanf("%d",&amp;a[i][j]);<br><br>memset(st,0,sizeof(st));<br><br>for&nbsp;(i=1;i&lt;=n;i++)<br><br>&nbsp;&nbsp;&nbsp;for&nbsp;(j=1;j&lt;=n;j++)<br><br>&nbsp;&nbsp;st[i][j]=st[i][j-1]+a[j][i];<br><br>&nbsp;&nbsp;maxn=0;<br><br>&nbsp;&nbsp;&nbsp;for&nbsp;(i=1;i&lt;=n;i++)<br><br>&nbsp;&nbsp;&nbsp;{<br><br>for&nbsp;(j=i;j&lt;=n;j++)<br><br>{<br><br>p=st[1][j]-st[1][i-1];<br><br>sum=p;<br><br>for&nbsp;(k=2;k&lt;=n;k++)<br><br>{<br><br>if&nbsp;(sum&gt;0)<br><br>sum+=st[k][j]-st[k][i-1];<br><br>else&nbsp;sum=st[k][j]-st[k][i-1];<br><br>if&nbsp;(sum&gt;p)&nbsp;p=sum;<br><br>}<br><br>if&nbsp;(p&gt;maxn)&nbsp;maxn=p;<br><br>}<br><br>&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;printf("%d\n",maxn);<br><br>&nbsp;&nbsp;&nbsp;return&nbsp;0;<br></div>
            原文地址：<a href="http://hi.baidu.com/flymouse/blog/item/fd1378f05c7ff7c37931aac3.html">http://hi.baidu.com/flymouse/blog/item/fd1378f05c7ff7c37931aac3.html</a></div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/luyulaile/aggbug/89674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-09 18:37 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/09/89674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1995: Energy 求连续子串使和最大</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/04/89209.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sat, 04 Jul 2009 01:27:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/04/89209.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/89209.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/04/89209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/89209.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/89209.html</trackback:ping><description><![CDATA[<p>Energy</p>
<hr>
<p>
<table cellSpacing=3 cellPadding=3 width="75%" border=1>
    <colgroup style="COLOR: red; TEXT-ALIGN: center" span=7>
    <tbody>
        <tr>
            <th height=40>Status</th>
            <th>In/Out</th>
            <th>TIME Limit</th>
            <th>MEMORY Limit</th>
            <th>Submit Times</th>
            <th>Solved Users</th>
            <th>JUDGE TYPE</th>
        </tr>
        <tr>
            <td align=middle height=40><span id=probinfo_placeholder><img height=20 src="http://acm.jlu.edu.cn/joj/images/ok1.gif" width=20></span></td>
            <td>stdin/stdout</td>
            <td>3s</td>
            <td>10240K</td>
            <td>717</td>
            <td>196</td>
            <td>Standard</td>
        </tr>
    </tbody>
</table>
</p>
<div class=prob_text>
<p>Mr. Jojer is a very famous chemist. He is doing a research about behavior of a group of atoms. Atoms may have different energy and energy can be positive or negative or zero, e.g. 18 or -9. Absolute value of energy can not be more than 100. Any number of continuous atoms can form an atom-group. Energy of an atom-group is defined by the sum of energy of all the atoms in the group. All the atoms form an atom-community which is a line formed by all the atoms one by one. Energy of an atom-community is defined by the greatest energy of an atom-group that can be formed by atoms in the atom-community. The problem is, given an atom-community, to calculate its energy.</p>
<h3>Input</h3>
<p>The input contains several test cases. Each test case consists of two lines describing an atom-community. The first line of each test case contains an integer N(N&lt;=1000000), the number of atoms in the atom-community. The second line of each test case contains N integers, separated by spaces, each representing energy of an atom, given in the order according to the atom-community. The last test case marks by N=-1, which you should not proceed.</p>
<h3>Output</h3>
<p>For each test case(atom-community description), print a single line containing the energy.</p>
<h3>Sample Input</h3>
<pre>5
8 0 6 4 -1
-1</pre>
<h3>Sample Output</h3>
<pre>18</pre>
</div>
<p><br>理解题意很重要，题目的意思是说 在m个中选&nbsp;&nbsp; 连续的n个atom能量值 使其最大。<br>程序中sumtemp，sum。sumtemp确定的是其左边界，sum确定其右边界。<br>sumtemp确定左边前n个数之和为负的最大的n，且第n个数显然为负，然后从n+1开始选数。<br>sum确定了右边界使其最大。<br>求和最大都可以用这种思路！！！！！！！！！！<br>举例<br>1，2，-4，4，2，-2，1，5，-6，5，-3，8，10<br>请看sumt1=1,sum=1<br>sumt2=2;sum=1+2=3;<br>sum3=sum2-4=-1;则sumtemp=0;sum不变。<br>sum4=sumtemp+4;sum&lt;sum4,sum=4;<br>sum5=sumtemp+2；sum&lt;sum5,sum=6<br>总之sum只有在sum&lt;sumtemp时才修改。sumtemp&lt;0则清0.<br>一维dp.<br>#include"stdio.h"<br>int main()<br>{<br>&nbsp;freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout);<br>&nbsp;int n;<br>&nbsp;int a;<br>&nbsp;while(scanf("%ld",&amp;n),n!=-1)<br>&nbsp;{&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long long&nbsp; sum=-0x7fffffff,sumtemp=-0x7fffffff;<br>&nbsp;&nbsp; for(long i=0;i&lt;n;i++)<br>&nbsp;&nbsp; {&nbsp;<br>&nbsp;&nbsp;&nbsp; scanf("%d",&amp;a);<br>&nbsp;&nbsp;&nbsp; if(sumtemp&gt;0)<br>&nbsp;&nbsp;&nbsp;sumtemp+=a;<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;sumtemp=a;<br>&nbsp;&nbsp;&nbsp; if(sumtemp&gt;sum)<br>&nbsp;&nbsp;&nbsp;sum=sumtemp;</p>
<p>&nbsp;&nbsp; }<br>&nbsp;&nbsp; printf("%lld\n",sum);</p>
<p>&nbsp;}<br>&nbsp;return 0;<br>}</p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/89209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-04 09:27 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/04/89209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>序偶对生成法一种表现形式</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/02/89086.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Thu, 02 Jul 2009 08:05:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/02/89086.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/89086.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/02/89086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/89086.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/89086.html</trackback:ping><description><![CDATA[<p>Tug of War</p>
<hr>
<p>
<table cellSpacing=3 cellPadding=3 width="75%" border=1>
    <colgroup style="COLOR: red; TEXT-ALIGN: center" span=7>
    <tbody>
        <tr>
            <th height=40>Status</th>
            <th>In/Out</th>
            <th>TIME Limit</th>
            <th>MEMORY Limit</th>
            <th>Submit Times</th>
            <th>Solved Users</th>
            <th>JUDGE TYPE</th>
        </tr>
        <tr>
            <td align=middle height=40><span id=probinfo_placeholder><img height=20 src="http://acm.jlu.edu.cn/joj/images/ok1.gif" width=20></span></td>
            <td>stdin/stdout</td>
            <td>15s</td>
            <td>8192K</td>
            <td>479</td>
            <td>114</td>
            <td>Standard</td>
        </tr>
    </tbody>
</table>
</p>
<div class=prob_text>A tug of war is to be arranged at the local office picnic. For the tug of war, the picnickers must be divided into two teams. Each person must be on one team or the other; the number of people on the two teams must not differ by more than 1; the total weight of the people on each team should be as nearly equal as possible.
<p>The first line of input contains <em>n</em> the number of people at the picnic. <em>n</em> lines follow. The first line gives the weight of person 1; the second the weight of person 2; and so on. Each weight is an integer between 1 and 450. There are at most 100 people at the picnic.
<p>The input may contain several test cases.
<p>Your output will be a single line containing 2 numbers: the total weight of the people on one team, and the total weight of the people on the other team. If these numbers differ, give the lesser first.
<h3>Sample Input</h3>
<pre>3
100
90
200
</pre>
<h3>Output for Sample Input</h3>
<pre>190 200
</pre>
</div>
<p><br>利用dp思想 ，n为偶数时求出s(n,n/2)，n为奇数时 也是s(2n,n/2)，和sum/2最接近的那个。非常经典的思路。<br>S(k, 1) = {A[i] | 1&lt;= i &lt;= k}<br>S(k, k) = {A[1]+A[2]+&#8230;+A[k]}<br>S(k, i) = S(k-1, i) U {A[k] + x | x属于S(k-1, i-1) }<br>//一下代码只能用于sum特别小的情况，否则会超时！！！！！！！！！！！<br>#include&lt;iostream&gt;<br>#include&lt;cstdlib&gt;<br>#define MAX 101 <br>#define min(a,b) ((a)&lt;(b) ? (a) : (b))<br>using namespace std;</p>
<p>&nbsp; int main()<br>&nbsp; {<br>&nbsp; freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout);<br>&nbsp; int num;<br>&nbsp; int a[MAX],i,j,k,l,m,NUM;<br>&nbsp; bool s[MAX][2500];<br>&nbsp; while(cin&gt;&gt;num)<br>&nbsp; {<br>&nbsp;&nbsp;int sum=0;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=num;i++)<br>&nbsp;&nbsp; {<br>&nbsp; cin&gt;&gt;a[i];<br>&nbsp; sum+=a[i];&nbsp;<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; if(num%2==0)NUM=num/2;<br>&nbsp;&nbsp; else NUM=num/2+1;</p>
<p>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;=num;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;=sum/2;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s[i][j]=false;//表示取i个物品能否达到重量是j. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; s[0][0]=true;<br>&nbsp;&nbsp; for(k=1;k&lt;=num;k++)//必须在最外层，元素不能重复 <br>&nbsp;&nbsp; for(j=min(k,NUM);j&gt;=1; j--)//递减的结果是使得不会出现在同一层次的互为因果 、、、、、、、、、、、巧妙的实现了课本上的序偶对生成法。<br>&nbsp;&nbsp; for(i=a[k];i&lt;=sum/2;i++)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;if(s[j-1][i-a[k]])<br>&nbsp;&nbsp;s[j][i]=true;<br>&nbsp;}<br>&nbsp;<br>&nbsp;for(i=sum/2; i&gt;=0; i--) {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if(s[NUM][i]) {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;i&lt;&lt;" "&lt;&lt;sum-i&lt;&lt;endl;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>}&nbsp; </p>
<p>&nbsp; }<br>&nbsp; //system("PAUSE");<br>&nbsp; return&nbsp;&nbsp; 0;<br>&nbsp; }<br>下一次实现一个序偶生成法。</p>
<p>#include &lt;iostream&gt;<br>#include &lt;functional&gt;<br>using namespace std;</p>
<p>int a[101];<br>bool b[101][45002];</p>
<p>int main(){<br>//&nbsp;freopen("s.txt","r",stdin);<br>//&nbsp; freopen("key.txt","w",stdout);<br>&nbsp;&nbsp;&nbsp; int N,M,i,j,k;<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;N)!=EOF){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(b,0,sizeof(b));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[0]=M=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=N;i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",a+i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M+=a[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[0][0]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=1;k&lt;=N;k++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=N/2;i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=M/2;j&gt;=0;j--){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b[i-1][j]){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[i][j+a[k]]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&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; for(i=M/2,j=M/2+1;i&gt;=0;i--,j++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b[N/2][i]){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d %d\n",i,M-i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b[N/2][j]){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d %d\n",M-j,j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&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; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br></p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/89086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-02 16:05 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/02/89086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 2521 Monkey and fruits 石子合并问题</title><link>http://www.cppblog.com/luyulaile/archive/2009/06/30/88932.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Tue, 30 Jun 2009 13:01:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/06/30/88932.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/88932.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/06/30/88932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/88932.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/88932.html</trackback:ping><description><![CDATA[<div class=prob_text>After culling his most favorite fruits from the trees in an orchard,Keen AS, a mischievous monkey, is confused of the way in which he can combine these piles of fruits into one in the most laborsaving manner. Each turn he can merely combine any two piles into a larger one. Obviously, by combining N-1 times for N piles of fruits, one pile results eventually. It always takes AS a certain quantity of units of stamina, which equals to the sum of the amounts of fruits in each of the two piles combined, to complete a combination. For instance, given three piles of fruits, containing 1, 2, and 9 fruits respectively, the combination of 1 and 2 would cost 3=1+2 units of stamina, and two piles-3 and 9-are resulted; finally, combining them would cost another 12=3+9 units of stamina, and the total units of stamina taken in the whole procedure is 15=3+12. Surely there are many a possible means to combine these three piles; however, it can be proved that 15 is the minimum amount of units of stamina in demand, and that is what your program is required to do. in this problem ,the fruits are put in a strait line. A pile of fruits 'P' can only combined with the rightest pail on the left of P or the leftest on the right of P, and the united pile will at the position of the bigger one.
<h3>Input</h3>
The input file consists of many test cases. The first line contains an integer N (&lt;=100), indicating the number of piles, and the second line contains N integers, each of which represents the amount of fruits in a pile. no integer will more than 10000, the sequence of integer also means the location of the piles.
<h3>Output</h3>
Your program should print the minimum amount of units of stamina that are required to combine these piles of fruits into one on request.
<h3>Sample Input</h3>
<pre>3
1 2 9
</pre>
<h3>Sample Output</h3>
<pre>15
</pre>
</div>
<br>典型的石子合并问题。<br>#include&lt;stdio.h&gt;<br>int a[101][101],sum[101];<br>int stone[101];<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int n,i,j,k,flag,l,t;<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;n)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;stone[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum[0]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum[i]=sum[i-1]+stone[i];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[i][i]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(l=1;l&lt;=n-1;l++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n-l;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j=i+l; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=i;k&lt;j;k++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t=a[i][k]+a[k+1][j]+sum[j]-sum[i-1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!flag)<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[i][j]=t;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(t&lt;a[i][j])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[i][j]=t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",a[1][n]);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-06-30 21:01 <a href="http://www.cppblog.com/luyulaile/archive/2009/06/30/88932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1026 动态规划，生成函数及改进</title><link>http://www.cppblog.com/luyulaile/archive/2009/06/27/88628.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sat, 27 Jun 2009 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/06/27/88628.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/88628.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/06/27/88628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/88628.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/88628.html</trackback:ping><description><![CDATA[<div class=prob_text>
<p>One curious child has a set of N little bricks. From these bricks he builds different staircases. Staircase consists of steps of different sizes in a strictly descending order. It is not allowed for staircase to have steps equal sizes. Every staircase consists of at least two steps and each step contains at least one brick. Picture gives examples of staircase for N=11 and N=5:</p>
<p align=center><img height=163 src="http://acm.jlu.edu.cn/joj/images/problems/1026.gif" width=623> </p>
<p align=left>Your task is to write a program that reads from input numbers N and writes to output numbers Q - amount of different staircases that can be built from exactly N bricks.</p>
<br>
<h3>Input</h3>
Numbers N, one on each line. You can assume N is between 3 and 500, both inclusive. A number 0 indicates the end of input.
<p>&#160;</p>
<p>&#160;</p>
<br>
<h3>Output</h3>
Numbers Q, one on each line.
<p>&#160;</p>
<br>
<h3>Sample Input</h3>
<pre>3
5
0
</pre>
<h3>Sample Output</h3>
<pre>1
2
</pre>
方法1，动态规划<br><br>#include&lt;iostream&gt;<br>#include&lt;cstdlib&gt;<br>using namespace std;<br>&nbsp; int main()<br>&nbsp; {<br>&nbsp; freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout);<br>&nbsp; double f[501][501]={0};<br>&nbsp; double s;<br>&nbsp; int i,j,k,n;<br>&nbsp; for(i=3;i&lt;=500;i++)<br>&nbsp; for(j=1;j&lt;=(i-1)/2;j++)<br>&nbsp;&nbsp;&nbsp; f[i][j]=1;<br>&nbsp; for(i=3;i&lt;=500;i++)<br>&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=(i-1)/2;j++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;for(k=j+1;k&lt;=(i-j-1)/2;k++)<br>&nbsp;&nbsp; f[i][j]=f[i-j][k];&nbsp;<br>&nbsp;}<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;n),n) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s=0; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=(n-1)/2;i++) s+=f[n][i]; //f[n]=f[n][1]+f[n][2]+-----+f[n][floor((i-1)/2)]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.0f\n",s); <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp; //system("PAUSE");<br>&nbsp; return&nbsp;&nbsp; 0;<br>&nbsp; }<br>更妙的方法：生成函数法<br>计算(1+x)(1+x^2)(1+x^3)-----,x^n的系数即为所求<br>int i,j;<br>double ans[510]={1,1};//已经把ans[1]和ans[0]赋为1了，其余为0<br>&nbsp;for(i=2;i&lt;=500;i++) {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=500;j&gt;=0;j--) {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i+j&lt;=500) ans[i+j]+=ans[j]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp; <br><br>先计算(1+x)(1+x^2)<br>再计算(1+x)(1+x^2)&nbsp;&nbsp; *(1+x^3)<br></div>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-06-27 10:44 <a href="http://www.cppblog.com/luyulaile/archive/2009/06/27/88628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>