??xml version="1.0" encoding="utf-8" standalone="yes"?>久久人与动人物a级毛片,国产精品成人久久久久三级午夜电影 ,久久久久久一区国产精品http://www.shnenglu.com/billhsu/category/7691.htmlzh-cnThu, 23 Jun 2011 13:22:13 GMTThu, 23 Jun 2011 13:22:13 GMT60骨骼动画中的反向动力?/title><link>http://www.shnenglu.com/billhsu/archive/2010/08/26/124852.html</link><dc:creator>Bill Hsu</dc:creator><author>Bill Hsu</author><pubDate>Thu, 26 Aug 2010 09:29:00 GMT</pubDate><guid>http://www.shnenglu.com/billhsu/archive/2010/08/26/124852.html</guid><wfw:comment>http://www.shnenglu.com/billhsu/comments/124852.html</wfw:comment><comments>http://www.shnenglu.com/billhsu/archive/2010/08/26/124852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/billhsu/comments/commentRss/124852.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/billhsu/services/trackbacks/124852.html</trackback:ping><description><![CDATA[<span id="3h99vpf" class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;">IK在骨骼动画里常常能看刎ͼ作用是Ҏ子骨骼的方位推算出它的那些父骨骼方位。可是一直都是知道有那么回事Q但是又不太知道具体是怎么实现的?br />在multi-crash.com上看C?a target="_blank" ><span style="font-style: italic;">骨骼动画反向动力?IK)的实?nbsp; </span></a>Q内容写的很易懂?br />q是ZCCD(</span>Cyclic Coordinate Descent<span id="jrpfln1" class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;">)法的。还有种雅可比矩늚法Q不q这U算法我q不太清楚,希望高手指教啊?br />下面讲讲CCDQ先看这张图?br /><img style="width: 540px; height: 214px;" src="http://www.shnenglu.com/images/cppblog_com/billhsu/ccd.gif" border="0" alt="" /><br />注意图中的红U和l线Q红U是当前骨骼与目标骨骼的q线Q绿U是目标骨骼与最l位|的q线?br />从子骨骼到父骨骼的顺序P代计,旋{U线到绿Uѝ这样多q代几次׃得到较好的结果?br /><br />要注意的是需要对骨骼的旋转范围加以限Ӟ因ؓZ的关节不是以可以L方式旋{的?br /><img src="http://www.shnenglu.com/images/cppblog_com/billhsu/ccd3.JPG" border="0" alt="" /><br />[例如图中蓝色部分为可以旋转的范围]<br /><br /><span style="font-style: italic;"></span></span><img src ="http://www.shnenglu.com/billhsu/aggbug/124852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/billhsu/" target="_blank">Bill Hsu</a> 2010-08-26 17:29 <a href="http://www.shnenglu.com/billhsu/archive/2010/08/26/124852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Zshader的骨D皮计?/title><link>http://www.shnenglu.com/billhsu/archive/2010/04/01/111326.html</link><dc:creator>Bill Hsu</dc:creator><author>Bill Hsu</author><pubDate>Thu, 01 Apr 2010 14:10:00 GMT</pubDate><guid>http://www.shnenglu.com/billhsu/archive/2010/04/01/111326.html</guid><wfw:comment>http://www.shnenglu.com/billhsu/comments/111326.html</wfw:comment><comments>http://www.shnenglu.com/billhsu/archive/2010/04/01/111326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/billhsu/comments/commentRss/111326.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/billhsu/services/trackbacks/111326.html</trackback:ping><description><![CDATA[     摘要: 我的古董昑֍很操蛋,好端端的shaderQ传骨骼矩阵q去Q硬是没反应。?<br>d觅觅Q找C NVIDIA SDK 的exampleQ终于解决了?<br>N我的昑֍不支持BLENDINDICES和BLENDWEIGHT? <br>把BLENDINDICES和BLENDWEIGHT用TEXCOORD[n]表示才正常。?<br>不说废话Q直接上代码?nbsp; <a href='http://www.shnenglu.com/billhsu/archive/2010/04/01/111326.html'>阅读全文</a><img src ="http://www.shnenglu.com/billhsu/aggbug/111326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/billhsu/" target="_blank">Bill Hsu</a> 2010-04-01 22:10 <a href="http://www.shnenglu.com/billhsu/archive/2010/04/01/111326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GPU水面模拟http://www.shnenglu.com/billhsu/archive/2010/03/23/110376.htmlBill HsuBill HsuTue, 23 Mar 2010 12:59:00 GMThttp://www.shnenglu.com/billhsu/archive/2010/03/23/110376.htmlhttp://www.shnenglu.com/billhsu/comments/110376.htmlhttp://www.shnenglu.com/billhsu/archive/2010/03/23/110376.html#Feedback0http://www.shnenglu.com/billhsu/comments/commentRss/110376.htmlhttp://www.shnenglu.com/billhsu/services/trackbacks/110376.html

效果比较单,只是模拟了下水面的反效果。折与FresnelpL没有考虑?br />
水面模拟大致需要分q么几步Q?br />1.剪裁掉水面以下的点[gpu里的clipplane要注意{换到Clip Space]Q?br />摄像机攑ֈ同原摄像机关于水面对U的位置Q比如原来摄像机?x,y,z)Q?br />此时p把摄像机攑֜(x,-y,z)Qup向量也要讄成向下的?br />再把场景渲染到Render Target的纹理上(我用的纹理大是256*256)Q不知道Z么Render Target的纹理大不能超q窗口大,过的话渲染会出错,知道的大大告诉我一下哈?br />
于是Q就得到了这样一个纹理:


2.上面得到的U理与水面的点对应.
把Vertex Shader中乘q变换矩阵后的坐标传到Pixel Shader,
在PS中计?br />
        float2 clipspace = input.Coord.xy / input.Coord.w;
        clipspace.x=((clipspace.x * 0.5f) + 0.5f);
        clipspace.y = ((clipspace.y * -0.5f) + 0.5f);
        clipspace.x=1-clipspace.x;
既可以让水面点与纹理对应,然后再想办法把纹理坐标扰乱来模拟水面波动?br />
3.再渲染一ơ场景就可以了?br />
大家也可以参考下Azure的水面渲染源代码Q?a temp_href=" http://www.azure.com.cn/article.asp?id=186" href="%20http://www.azure.com.cn/article.asp?id=186">
http://www.azure.com.cn/article.asp?id=186


Bill Hsu 2010-03-23 20:59 发表评论
]]>
可编E管道下的剪裁^?/title><link>http://www.shnenglu.com/billhsu/archive/2010/01/20/106088.html</link><dc:creator>Bill Hsu</dc:creator><author>Bill Hsu</author><pubDate>Wed, 20 Jan 2010 14:00:00 GMT</pubDate><guid>http://www.shnenglu.com/billhsu/archive/2010/01/20/106088.html</guid><wfw:comment>http://www.shnenglu.com/billhsu/comments/106088.html</wfw:comment><comments>http://www.shnenglu.com/billhsu/archive/2010/01/20/106088.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/billhsu/comments/commentRss/106088.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/billhsu/services/trackbacks/106088.html</trackback:ping><description><![CDATA[ <p class="MsoNormal"> <span>剪裁q面</span> <span>(Clip Plane)</span> <span>在图形学领域有着重要的作用,比如水面模拟中,渲染折射U理Ӟ我们必d水面以上的顶炚w过剪裁q面剪裁掉?/span> </p> <p class="MsoNormal"> <span>在过ȝ固定渲染道时代Q剪裁^面的实现较ؓ单,比如?/span> <span>DirectX 9</span> <span>中,可以先设定剪裁^面在世界坐标pM的方E?/span> <span>(ax+by+cz+d=0)</span> <span>Q再调用</span> <span>SetClipPlane(DWORD Index,CONST float * pPlane)</span> <span>q个</span> <span>API</span> <span>函数可以了?/span> </p> <p class="MsoNormal"> <span> </span> </p> <p class="MsoNormal"> <span>附上例子E序Q?/span> </p> <p class="MsoNormal" style="background: none repeat scroll 0% 0% rgb(238, 238, 238); text-align: left; -moz-background-inline-policy: continuous;" align="left"> <span style="font-size: 10pt; color: black;">vPosition=D3DXVECTOR3(0,0,0);</span> <span style="font-size: 10pt; color: green;">//</span> <span style="font-size: 10pt; color: green;">q面上一个点<span><br /></span></span> <span style="font-size: 10pt; color: black;">vNormal=D3DXVECTOR3(0,1,0);</span> <span style="font-size: 10pt; color: green;">//</span> <span style="font-size: 10pt; color: green;">法向?span><br /></span></span> <span style="font-size: 10pt; color: black;">D3DXPlaneFromPointNormal( &clipplane, &vPosition, &vNormal );</span> <span style="font-size: 10pt; color: green;">//</span> <span style="font-size: 10pt; color: green;">生成剪裁q面<span><br /></span></span> <span style="font-size: 10pt; color: black;"> <br /> m_pDevice()->SetClipPlane( 0, (</span> <span style="font-size: 10pt; color: blue;">float</span> <span style="font-size: 10pt; color: black;">*)clipplane); </span> </p> <p class="MsoNormal"> <span> </span> </p> <p class="MsoNormal"> <span>然而,在现在的可编E管?/span> <span>(programmable pipeline)</span> <span>下,讄的剪裁^面会被在剪裁坐标pM处理Q而不是在世界坐标pM?/span> </p> 解决q个问题的方法有Q?br /><br /> 1Q?l要剪裁的顶点做标记Q在Pixel Shader中把它剪裁掉?br /><br /> 2Q?使用q斜q面裁剪QOblique Near-Plane ClippingQ,即修Ҏq阵,要剪裁的顶Ҏ在视截体之外Q从而避免了该顶点的l制?br /><br /> 3Q?修改q面方程Q之从世界坐标p{换到剪裁坐标pR?span><br /><br /><br /> 上述Ҏ中,W一U和W二U效率ƈ不高Q在</span><span>Pixel Shader</span><span>中剪裁没有减Q何不必要的顶点处理,而计近斜^面裁剪矩阵较为繁琐。所以,Ҏ三是最佳选择?/span><p class="MsoNormal"><span> </span><span>要将一个^面从世界坐标p{换到剪裁坐标p,必须求出q个变换矩阵?/span></p><p class="MsoNormal"><span>讑^面方E?/span><span>ax+by+cz+d=0</span><span>Q用一?/span><span>4</span><span>l向量来</span><span>n</span><span>表示</span><span>(a,b,c,d)</span><span>Q设q面上有个点</span><span>p:(x,y,z,1)</span><span>。根据^面方E的定义Q有Q?/span></p><p class="MsoNormal"><span><br /></span></p><p class="MsoNormal"><strong>n</strong><sup>T</sup><strong>p</strong> = ax + by + cz + d = 0</p><p class="MsoNormal"></p><p class="MsoNormal"><span>讄?/span><span>R</span><span>可以让点</span><span>P</span><span>从世界坐标系转换到剪裁坐标系Q矩?/span><span>Q</span><span>可以让^?/span><span>n</span><span>实现同样的变换。那么,有:</span></p><p class="MsoNormal" style="text-align: center;" align="center"></p><div align="left"><strong>p</strong>'= <strong>R</strong><strong>p</strong></div><div align="left"><strong>n'</strong>= <strong>Q</strong><strong>n</strong></div><p class="MsoNormal"><span>其中</span><span>p'</span><span>?/span><span>n'</span><span>分别是{换后的点与^面?/span></p><br /><div align="left"><strong>n</strong><span>'</span><sup>T</sup><strong>p'</strong>= 0</div><div align="left">(<strong>Q</strong><strong>n</strong>)<sup>T</sup> (<strong>R</strong><strong>p</strong>) = 0 <br /><strong>n</strong><sup>T</sup><strong>Q</strong><sup>T</sup><strong>R</strong><strong>p</strong> = 0<br /><br /><br /><span>如果Q?/span><strong>Q</strong><sup>T</sup><strong>R</strong> = <strong>I</strong></div><br /><p class="MsoNormal"><span>那么Q?/span></p><p class="MsoNormal"><strong>n</strong><sup>T</sup><strong>Q</strong><sup>T</sup><strong>R</strong><strong>p</strong> = <strong>n</strong><sup>T</sup><strong>I</strong><strong>p</strong> = <strong>n</strong><sup>T</sup><strong>p</strong> = 0</p><p class="MsoNormal"><span>于是Q?/span></p><div align="left"><strong>Q</strong><sup>T</sup> = <strong>R</strong><sup>-1</sup><strong><br /> Q</strong> = (<strong>R</strong><sup>-1</sup>)<sup>T</sup></div><br /><p class="MsoNormal"><span>?/span><span>DirectX 3D</span><span>中,一个点从世界坐标系转换到剪裁坐标系Q所用的矩阵察矩阵与投媄矩阵的乘U,卻I</span></p><p class="MsoNormal" style="background: none repeat scroll 0% 0% rgb(238, 238, 238); -moz-background-inline-policy: continuous;"><span style="font-size: 10pt; color: black;">D3DXMATRIX  TranMatrix = matView*matProj;</span></p><p class="MsoNormal"><span style="font-size: 9pt;">(TranMatrix</span><span style="font-size: 9pt;">为所求的变换矩阵Q?span>matView</span>?span>matProj</span>分别?/span><span>观察矩阵与投q?/span><span>)</span></p><p class="MsoNormal"><span> </span></p><p class="MsoNormal"><span>附上?/span><span>D3D</span><span>中变换的完整代码Q?/span></p><p class="MsoNormal" style="background: none repeat scroll 0% 0% rgb(238, 238, 238); text-align: left; -moz-background-inline-policy: continuous;" align="left"><span style="font-size: 10pt; color: black;">D3DXPLANE tempPlane = clipplane;<br /> D3DXPlaneNormalize(&tempPlane, &tempPlane);<br /><br /> D3DXMATRIX  TranMatrix = matView*matProj;<br /> D3DXMatrixInverse(&TranMatrix, NULL, &TranMatrix);<br /> D3DXMatrixTranspose(&TranMatrix, &TranMatrix);<br /> D3DXPlaneTransform(&tempPlane, &tempPlane, &TranMatrix);</span></p><p class="MsoNormal" style="background: none repeat scroll 0% 0% rgb(238, 238, 238); text-align: left; -moz-background-inline-policy: continuous;" align="left"></p><p class="MsoNormal"></p><p class="MsoNormal"><span>参考资料:</span></p><p class="MsoNormal"><span>1.Back Face Culling Notes ,Jordan Smith (University of California, Berkeley)<br /></span></p><p class="MsoNormal"><span>http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/backfacecull.shtml</span> </p><p class="MsoNormal">2.GameDev Forum</p><p class="MsoNormal">http://www.gamedev.net/community/forums/topic.asp?topic_id=402381</p><p class="MsoNormal">3.Oblique Near-Plane Clipping with Orthographic Camera ,Aras</p><p class="MsoNormal">http://aras-p.info/texts/obliqueortho.html</p><img src ="http://www.shnenglu.com/billhsu/aggbug/106088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/billhsu/" target="_blank">Bill Hsu</a> 2010-01-20 22:00 <a href="http://www.shnenglu.com/billhsu/archive/2010/01/20/106088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>矩阵求逆代?/title><link>http://www.shnenglu.com/billhsu/archive/2009/12/11/103010.html</link><dc:creator>Bill Hsu</dc:creator><author>Bill Hsu</author><pubDate>Fri, 11 Dec 2009 14:23:00 GMT</pubDate><guid>http://www.shnenglu.com/billhsu/archive/2009/12/11/103010.html</guid><wfw:comment>http://www.shnenglu.com/billhsu/comments/103010.html</wfw:comment><comments>http://www.shnenglu.com/billhsu/archive/2009/12/11/103010.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.shnenglu.com/billhsu/comments/commentRss/103010.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/billhsu/services/trackbacks/103010.html</trackback:ping><description><![CDATA[     摘要: 感觉U性代C业里一直少不了矩阵求逆, <br> <br>写个带输出算逆矩늚步骤的矩阉|逆程序,希望l即或正在学线代的同学一Ҏѝ?nbsp; <a href='http://www.shnenglu.com/billhsu/archive/2009/12/11/103010.html'>阅读全文</a><img src ="http://www.shnenglu.com/billhsu/aggbug/103010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/billhsu/" target="_blank">Bill Hsu</a> 2009-12-11 22:23 <a href="http://www.shnenglu.com/billhsu/archive/2009/12/11/103010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最L排序法演示http://www.shnenglu.com/billhsu/archive/2009/11/08/100381.htmlBill HsuBill HsuSat, 07 Nov 2009 16:08:00 GMThttp://www.shnenglu.com/billhsu/archive/2009/11/08/100381.htmlhttp://www.shnenglu.com/billhsu/comments/100381.htmlhttp://www.shnenglu.com/billhsu/archive/2009/11/08/100381.html#Feedback0http://www.shnenglu.com/billhsu/comments/commentRss/100381.htmlhttp://www.shnenglu.com/billhsu/services/trackbacks/100381.html


Bill Hsu 2009-11-08 00:08 发表评论
]]>
寻\法整理http://www.shnenglu.com/billhsu/archive/2009/01/23/72513.htmlBill HsuBill HsuFri, 23 Jan 2009 09:22:00 GMThttp://www.shnenglu.com/billhsu/archive/2009/01/23/72513.htmlhttp://www.shnenglu.com/billhsu/comments/72513.htmlhttp://www.shnenglu.com/billhsu/archive/2009/01/23/72513.html#Feedback3http://www.shnenglu.com/billhsu/comments/commentRss/72513.htmlhttp://www.shnenglu.com/billhsu/services/trackbacks/72513.html
1.DFS
优先深入每个图,直到扑ֈ目标节点
往往可以扑ֈ到达路线Q可往往不是最优的?br />09-1-23-DFS.JPG


2.BFS
q度优先地寻扄标节炏V?br />往往可以扑ֈ最优\径,但耗时多?br />09-1-23-BFS.JPG


3.Dijkstra
使用了动态规划(原文中称为“边放松”)//该ؓ贪心Q本人罪q?br />速度较快
09-1-23-Dijkstra.JPG


4.A*
与Dijkstra怼Q用启发因?F=G+H)Q速度是以上算法里最快的?br />可以看看Q?br />http://hi.baidu.com/probill/blog/item/80d71f1b19e2fe1e8718bfe5.html
09-1-23-Astar.JPG

5.创徏D?br />09-1-23-Nav.JPG


Bill Hsu 2009-01-23 17:22 发表评论
]]>
A* (A-star A?寻\法http://www.shnenglu.com/billhsu/archive/2008/11/01/65700.htmlBill HsuBill HsuSat, 01 Nov 2008 10:19:00 GMThttp://www.shnenglu.com/billhsu/archive/2008/11/01/65700.htmlhttp://www.shnenglu.com/billhsu/comments/65700.htmlhttp://www.shnenglu.com/billhsu/archive/2008/11/01/65700.html#Feedback0http://www.shnenglu.com/billhsu/comments/commentRss/65700.htmlhttp://www.shnenglu.com/billhsu/services/trackbacks/65700.html仔细看了看gamedev.net的一片文?A* Pathfinding for Beginners http://www.gamedev.net/reference/articles/article2003.asp )Q对A*更了解了一点,写点东西记录一下?br />A*是一U启发式的算法,所谓的"启发?Q就是对每一个搜索的位置q行评估Q也是把找的位|离目标的距d成找点的一个依据,然后猜测q个Ҏ否最?"启发?是猜测)?br />
image001.jpg

Z扑ֈ最佳的那个?br />可以规定Q?br />G = 从v点,沿着产生的\径,Ud到网g指定Ҏ的距R?br />H = 从网g那个ҎUd到终点B的预估移动距R?br />
F = G + H
F最的点可以认为是该选的炏V?br />
引用一下原文的译Q?br />我们令水qx者垂直移动的耗费?0Q对角线方向耗费?4。我们取q些值是因ؓ沿对角线的距L沿水qx垂直Ud耗费的的根号2Q别怕)Q或者约1.414倍。ؓ了简化,我们?0?4q似。比例基本正,同时我们避免了求根运和数?br />

既然我们在计沿特定路径通往某个Ҏ的G|求值的Ҏ是取它父节点的G|然后依照它相对父节点是对角线方向或者直角方?非对角线)Q分别增?4?0。例子中q个Ҏ的需求会变得更多Q因为我们从LҎ以外获取了不止一个方根{?br />
H值可以用不同的方法估。我们这里用的Ҏ被称为曼哈顿ҎQ它计算从当前格到目的格之间水^和垂直的Ҏ的数量dQ忽略对角线方向。然后把l果乘以10。这被成为曼哈顿Ҏ是因为它看v来像计算城市中从一个地方到另外一个地方的街区敎ͼ在那里你不能沿对角线方向I过街区。很重要的一点,我们忽略了一切障物。这是对剩余距离的一个估,而非实际|q也是这一Ҏ被称为启发式的原因。想知道更多Q你可以在这里找到方E和额外的注解?br />


W一步搜索的l果可以在下面的图表中看到。F,G和H的评分被写在每个Ҏ里。正如在紧挨起始格右侧的Ҏ所表示的,F被打印在左上角,G在左下角QH则在右下角?/span>

image003.jpg

引用一下原文的译Q?/span>

我们做如下操作开始搜索:
   
1Q从点A开始,q且把它作ؓ待处理点存入一个“开启列表”。开启列表就像一张购物清单。尽现在列表里只有一个元素,但以后就会多h。你的\径可能会通过它包含的ҎQ也可能不会。基本上Q这是一个待查方格的列表?br />   2Q寻找v点周围所有可到达或者可通过的方|跌有墙Q水Q或其他无法通过地Ş的方根{也把他们加入开启列表。ؓ所有这些方g存点A作ؓ“父Ҏ”。当我们xq\径的时候,父方格的资料是十分重要的。后面会解释它的具体用途?br />   3Q从开启列表中删除点AQ把它加入到一个“关闭列表”,列表中保存所有不需要再ơ检查的Ҏ?br />
Zl箋搜烦Q我们简单的从开启列表中选择F值最低的Ҏ。然后,寚w中的方格做如下处理Q?br />
   
4Q把它从开启列表中删除Q然后添加到关闭列表中?br />   5Q检查所有相L子。蟩q那些已l在关闭列表中的或者不可通过?有墙Q水的地形,或者其他无法通过的地?Q把他们dq开启列表,如果他们q不在里面的话。把选中的方g为新的方格的父节炏V?br />   6Q如果某个相L已经在开启列表里了,查现在的q条路径是否更好。换句话_查如果我们用新的路径到达它的话,G值是否会更低一些。如果不是,那就什么都不做?br />      另一斚wQ如果新的G值更低,那就把相L格的父节Ҏ为目前选中的方|在上面的图表中,把箭头的方向改ؓ指向q个ҎQ。最后,重新计算F和G的倹{如果这看v来不够清晎ͼ你可以看下面的图C?/span>


image004.jpg

image005.jpg

image006.jpg

image007.jpg

q样可以找到最佌\径了?br />



Bill Hsu 2008-11-01 18:19 发表评论
]]>
经元网l的入门http://www.shnenglu.com/billhsu/archive/2008/08/30/60455.htmlBill HsuBill HsuSat, 30 Aug 2008 12:08:00 GMThttp://www.shnenglu.com/billhsu/archive/2008/08/30/60455.htmlhttp://www.shnenglu.com/billhsu/comments/60455.htmlhttp://www.shnenglu.com/billhsu/archive/2008/08/30/60455.html#Feedback2http://www.shnenglu.com/billhsu/comments/commentRss/60455.htmlhttp://www.shnenglu.com/billhsu/services/trackbacks/60455.html
2001 q?nbsp;6 ?nbsp;01 ?br>
    经|络也许是计机计算的将来,一个了解它的好Ҏ是用一个它可以解决的难题来说明。假讄?nbsp;
500 个字W的代码D,您知道它们是 C、C++、Java 或?nbsp;Python。现在构造一个程序,来识别编写这D代码的语言。一U解x案是构造一个能够学习识别这些语a的神l网l。这文章讨Z经|络的基本功能以及构造神l网l的ҎQ这样就可以在编码时应用它们了?/span>

Bill注:解释一下,q文章是? ( _ . = ; " , ' * / { } : - 0 + 1 [ ] q?0个特D符号出现频?人工经元的判断来识?span style="color: #000000;">代码D?/span>?nbsp;C、C++、Java 或?nbsp;Python


Ҏ一个简化的l计Qh脑由百亿条神l组?? 每条经q_q结到其它几千条经。通过q种q结方式Q神l可以收发不同数量的能量。神l的一个非帔R要的功能是它们对能量的接受ƈ不是立即作出响应Q? 是将它们累加hQ当q个累加的d辑ֈ某个临界阈值时Q它们将它们自己的那部分能量发送给其它的神l。大脑通过调节q些q结的数目和强度q行学习。尽? q是个生物行为的化描q。但同样可以充分有力地被看作是神l网l的模型?/p>

阈值逻辑单元QThreshold Logic UnitQTLUQ?/span>

理解经|络的第一步是从对抽象生物经开始,q把重点攑֜ 阈值逻辑单元QTLUQ?/em>q一特征上。一? TLU 是一个对象,它可以输入一l加权系数的量,对它们进行求和,如果q个和达到或者超q了某个阈|输出一个量? 让我们用W号标注q些功能Q首先,有输入g及它们的权系敎ͼX 1, X 2, ..., X n?W 1, W 2, ..., W n。接着是求和计出?X i*W i Q生了Ȁ发层 aQ换一U方法表C:

a = (X1 * W1)+(X2 * W2)+...+(Xi * Wi)+...+ (Xn * Wn)

阈值称?theta。最后,输出l果 y。当 a >=theta ?y=1Q反? y=0。请注意输出可以是连l的Q因为它也可以由一?squash 函数 sQ或 sigmaQ判定,该函数的自变量是 aQ函数值在 0 ?1 之间Qy=s(a)?/p>
?1. 阈值逻辑单元Q带?sigma 函数Q顶部)?cutoff 函数Q底部)
阈值逻辑单元

TLU 会分c,假设一?TLU 有两个输入|它们的权pL{于 1Qtheta 值等?1.5。当q个 TLU 输入 <0,0>?lt;0,1>?lt;1,0> ?<1,1> Ӟ它的输出分别?0???。TLU 这些输入分Zl:0 l和 1 l。就像懂得逻辑q接Q布运? ANDQ的可以cM地将逻辑q接的句子分c那PTLU 也懂得一炚w辑q接之类的东ѝ?/p>

TLU 能够用几何学上的解释来阐明这U现象。它的四U可能输入对应于W卡图的四个点。从{式 X 1*W 1+ X 2*W 2 = thetaQ换句话_也即 TLU 转换其分c行为的点开始,它的炚w分布在曲U?X 2 = -X 1 + 1.5 上。这个方E的曲线?4 个可能的输入分成了两个对应于 TLU 分类的区域。这?TLU 原理中更为普通的实例。在 TLU 有Q意数目的 N 个输入的情况下,一l可能的输入对应?N l空间中的一个点集。如果这些点可以被超q面 ? 换句话说Q对应于上面CZ中的U的 N l的几何外Ş切割Q那么就有一l权pL和一个阈值来定义其分cd好与q个切割相匹配的 TLU?

Bill注:所谓的Nl空间就是N个输入节?br>

TLU 的学习原?/span>

既然 TLU 懂得分类Q它们就知道素材。神l网l也可假定ؓ可以学习。它们的学习机制是模仿大脑调节神l连l的原理。TLU 通过改变它的权系数和阈值来学习。实际上Q从数学的观点看Q权pL阈值的特征有点武断。让我们回想一下当 SUM(Xi * Wi) >= theta ?TLU 在界点时输出的?1 而不? 0Q这相当于说临界Ҏ出现?SUM(X i* W i)+ (-1 * theta) >= 0 的时候。所以,我们可以?-1 看成一个常量输入,它的权系?theta 在学习(或者用技术术语,UCؓ 培训Q的q程中进行调整。这P? SUM(X i* W i)+ (-1 * theta) >= 0 Ӟy=1Q反?y=0?

在培训过E中Q神l网l输入:

  1. 一pd需要分cȝ术语CZ
  2. 它们的正分cL者目?/li>

q样的输入可以看成一个向量:<X 1, X 2, ..., X n, theta, t>Q这?t 是一个目标或者正分cR神l网l用q些来调整权pLQ其目的使培训中的目标与其分cȝ匚w。更切地说Q这是有指导的培训,与之相反的是无指导的培训。前者是Z带目标的CZQ而后者却只是建立在统计分析的基础上。权pL的调整有一个学习规则,一个理惛_的学习算法如下所C:


清单 1. 理想化的学习法
fully_trained = FALSE
DO UNTIL (fully_trained):
fully_trained = TRUE
FOR EACH training_vector = <X1, X2, ..., Xn, theta, target>::
# Weights compared to theta
a = (X1 * W1)+(X2 * W2)+...+(Xn * Wn) - theta
y = sigma(a)
IF y != target:
fully_trained = FALSE
FOR EACH Wi:
MODIFY_WEIGHT(Wi) # According to the training rule
IF (fully_trained):
BREAK

您或许想知道Q?#8220;哪些培训规则Q?#8221;有很多,不过有一条似乎合理的规则是基于这样一U思想Q即权系数和阈值的调整应该由分? (t - y) 定。这个规则通过引入 alpha (0 < alpha < 1) 完成。我们把 alpha UCؓ 学习?/em>。W i 中的更改值等? (alpha * (t - y)* Xi)。当 alpha 向?0 Ӟ经|络的权pL的调整变得保守一点;?alpha 向?1 Ӟ权系数的调整变得Ȁq。一个用这个规则的经|络UCؓ 感知?/em>Qƈ且这个规则被UCؓ 感知器学习规?/em>。Rosenblatt ?1962 q下的结论是Q如?N l空间的炚w被超q面切割Q那么感知器的培训算法的应用会最l导致权pL的分配,从而定义了一? TLUQ它的超q面会进行需要的分割。当ӞZ记v KeynesQ最l我们都切断了与外界的联p,专心思考。但是在计算旉之外Q我们仍Ȓ危险Q因为我们需要自q经|络对可能输入的I间q行不止一ơ的切割?

文章开始的N举例说明了这个,假设l您 N 个字W的代码D,您知道是 C、C++、Java 或? Python。难的是构造一个程序来标识~写q段代码的语a。用 TLU 来实现需要对可能的输入空间进行不止一ơ的分割。它需要把I间分成四个区域。每U语a一个区域。把经|络培训成能实现两个切割可完成q种工作。第一个切割将 C/C++ ?Java/Python 分开来,另一个将 C/Java ?C++/Python 分开。一个能够完成这些切割的|络同样可以识别源代码样本中的语a。但是这需要网l有不同l构Q在描述q个不同之处之前Q先来简单地看一下实跉|面的考虑?/p>

?2. 初步的(不完整的Q感知器学习模型
感知器学习模? name=

考虑到排除取?N 个字W代码所需的计时_l计?ASCII 码的 32 ?127 的范围内可视 ASCII 码字W出现的频率Qƈ在这个统计以及关于代码语a的目标信息的基础上培训神l网l。我们的Ҏ是将字符l计限制? C、C++、Java ?Python 代码字符库中最常用?20 个非字母数字字符。由于关注Q点运的执行Q我们打用一U规格化因素这 20 字符l计分开来,q以此培训我们的|络。显Ӟ一个结构上的不同是我们的网l有 20 个输入节点,但这是很正常的,因ؓ我们的描q已l暗CZq种可能性。一个更有意思的区别是出C一对中间节点,N1 ?N2Q以及输Ҏ量从两个变成了四个(O1 ?O4Q?/p>

我们培?N1Q这样当它一看到 C ?C++Q设|?y1=1Q看?Java ? PythonQ它设|?y1=0。同理培?N2Q当它一看到 C ?JavaQ设|? y2=1Q看?C++ ?PythonQ设|?y2=0。此外,N1 ?N2 输?1 ?0 l?Oi。现在如?N1 看到 C ?C++Q而且 N2 看到 C 或? JavaQ那么难题中的代码是 C。而如?N1 看到 C ?C++QN2 看到 C++ ? PythonQ那么代码就?C++。这个模式很显而易见。所以假?Oi 已被培训q根据下面表格的情况输出 1 ?0?/p>

映射到输出(作ؓ布尔函数Q的中间节点

N1 N2 O1 (C) O2 (C++) O3 (Java) O4 (Python)
0 0 0 0 0 1
0 1 0 0 1 0
1 0 0 1 0 0
1 1 1 0 0 0

如果q样可行的话Q我们的|络可以从代码CZ中识别出语言了。这个想法很好。但是在实践上却有些难以|信。不q这U解x案预CZ C/C++ ?Java/Python 输入被一个超q面切割了,同样 C/Java ? C++/Python 输入被另一个切剌Ӏ这是一个网l培训的解决ҎQ迂回地解决了这个输入空间的设想?/p>

Bill注:看v来很强大

关于 delta 规则

另一U培训的规则叫做 delta 规则。感知器培训规则是基于这样一U思\ ?权系数的调整是由目标和输出的差分方程表达式决定。? delta 规则是基于梯度降落这样一U思\。这个复杂的数学概念可以举个单的例子来表C。从l定的几Ҏ看,向南的那条\径比向东那条更陡些。向东就像从悬崖上掉 下来Q但是向南就是沿着一个略微倾斜的斜坡下来,向西像登一座陡峭的山,而北边则Cq_Q只要慢慢的闲逛就可以了。所以您要寻扄是到辑^地的所有\? 中将陡峭的d减少到最的路径。在权系数的调整中,经|络会扑ֈ一U将误差减少到最的权系数的分配方式?

我们的|络限制为没有隐藏节点,但是可能会有不止一个的输出节点Q设 p 是一l培训中的一个元素,t(p,n) 是相应的输出节点 n 的目标。但是,?y(p,n) ׃上提到的 squash 函数 s 军_Q这? a(p,n) 是与 p 相关?n 的激zd敎ͼ或者用 (p,n) = s( a(p,n) ) 表示Z p 相关的节?n ?squash q的Ȁzd数。ؓ|络讑֮权系敎ͼ每个 WiQ,也ؓ每个 p ?n 建立 t(p,n) ?y(p,n) 的差分,q就意味着为每?p 讑֮了网l全部的误差。因此对于每l权pL来说有一个^均误差。但? delta 规则取决于求q_值方法的_度以及误差。我们先不讨论细节问题,只是说一些与某些 p ?n 相关的误差:?* square( t(p,n) - y(p,n) )。现在,对于每个 WiQ^均误差定义如下:


清单 2. 查找q_误差
sum = 0
FOR p = 1 TO M: # M is number of training vectors
FOR n = 1 TO N: # N is number of output nodes
sum = sum + (1/2 * (t(p,n)-y(p,n))^2)
average = 1/M * sum

delta 规则是依据q个误差的定义来定义的。因差是依据那些培训向量来说明的Qdelta 规则是一U获取一个特D的权系数集以及一个特D的向量的算法。而改变权pL会使神l网l的误差最化。我们不需要讨论支持这个算法的微积分学Q只要认ZQ? Wi 发生的变化都是如下所C就够了Q?/p>
alpha * s'(a(p,n)) * (t(p,n) - y(p,n)) * X(p,i,n).

X(p,i,n) 是输入到节点 n ?p 中的W?i 个元素,alpha 是已知的学习率。最?s'( a(p,n) ) 是与 p 相关的第 n 个节Ҏzȝ squashing 函数的变化(zQ率Q这是 delta 规则Qƈ?Widrow ? Stearns 向我们展CZ? alpha 非常的时候,权系数向量接q某个将误差最化的向量。用于权pL调节的基? delta 规则的算法就是如此?


梯度降落Q直到误差小到适当的程度ؓ止)
step 1: for each training vector, p, find a(p)
step 2: for each i, change Wi by:
alpha * s'(a(p,n)) * (t(p,n)-y(p,n)) * X(p,i,n)

q里有一些与感知器算法相区别的重要不同点。显Ӟ在权pL调整的公式下有着完全不同的分析。delta 规则法L在权pL上调_而且q是建立在相对输出的ȀzL式上。最后,q不一定适用于存在隐藏节点的|络?/p>

反向传播q一法把支?delta 规则的分析扩展到了带有隐藏节点的经|络。ؓ了理解这个问题,设想 Bob l?Alice 讲了一个故事,然后 Alice 又讲l了 TedQTed 查了q个事实真相Q发现这个故事是错误的。现?Ted 需要找出哪些错误是 Bob 造成的而哪些又归咎? Alice。当输出节点从隐藏节点获得输入,|络发现出现了误差,权系数的调整需要一个算法来扑և整个误差是由多少不同的节炚w成的,|络需要问Q?#8220;是谁让我误入歧途?到怎样的程度?如何弥补Q?#8221;q时Q网l该怎么做呢Q?


?3Q?#8220;代码识别”反向传播的神l网l?

反向传播法同样来源于梯度降落原理,在权pL调整分析中的唯一不同是涉及到 t(p,n) ?y(p,n) 的差分。通常来说 W i的改变在于:

alpha * s'(a(p,n)) * d(n) * X(p,i,n)

其中 d(n) 是隐藏节?n 的函敎ͼ让我们来看(1Qn 对Q何给出的输出节点有多大媄响;Q?Q输Ҏw对|络整体的误差有多少影响。一斚wQn 影响一个输点越多,n 造成|络整体的误差也多。另一斚wQ如果输点媄响网l整体的误差少Qn 对输点的影响也相应减。这?d(j) 是对|络的整体误差的基|W(n,j) ?n ?j 造成的媄响,d(j) * W(n,j) 是这两种影响的d。但?n 几乎L影响多个输出节点Q也怼影响每一个输出结点,q样Qd(n) 可以表示为:

SUM(d(j)*W(n,j))

q里 j 是一个从 n 获得输入的输点,联系hQ我们就得到了一个培训规则,W?1 部分Q在隐藏节点 n 和输?j 之间权系数改变,如下所C:

alpha * s'(a(p,n))*(t(p,n) - y(p,n)) * X(p,n,j)

W?2 部分Q在输入节点 i 和输?n 之间权系数改变,如下所C:

alpha * s'(a(p,n)) * sum(d(j) * W(n,j)) * X(p,i,n)

q里每个?n 接收输入的输?j 都不同。关于反向传播算法的基本情况大致如此?/p>

?Wi 初始化ؓ的随机倹{?/p>

使误差小到适当的程度要遵@的步?/span>

W?1 步:输入培训向量?
W?2 步:隐藏节点计算它们的输?
W?3 步:输出节点在第 2 步的基础上计它们的输出?
W?4 步:计算W?3 步所得的l果和期望g间的差?
W?5 步:把第 4 步的l果填入培训规则的第 1 部分?
W?6 步:对于每个隐藏节点 nQ计?d(n)?
W?7 步:把第 6 步的l果填入培训规则的第 2 部分?

通常把第 1 步到W?3 步称? 正向传播Q把W?4 步到W?7 步称? 反向传播。反向传播的名字由此而来?

在掌握了反向传播法后,可以来看我们的识别源代码h语言的难题。ؓ了解册个问题,我们提供? Neil Schemenauer ?Python 模型 bpnn。用它的模型解决问题真是难以|信的简单,在我们的c? NN2 里定制了一个类 NN Q不q我们的改变只是调整了表达方式和整个q程的输出,q没有涉及到法。基本的代码如下所C:


清单 3Q用 bpnn.py 建立一个神l网l?/strong>
                # Create the network (number of input, hidden, and training nodes)
net = NN2(INPUTS, HIDDEN, OUTPUTS)
# create the training and testing data
trainpat = []
testpat = []
for n in xrange(TRAINSIZE+TESTSIZE):

#... add vectors to each set
# train it with some patterns
net.train(trainpat, iterations=ITERATIONS, N=LEARNRATE, M=MOMENTUM)
# test it
net.test(testpat)
# report trained weights
net.weights()


当然我们需要输入数据,实用E序 code2data.py 提供了这个功能。它的界面很直观Q只要将一堆扩展名各不相同的文件放C个子目录 ./code 中,然后q行q个实用E序Qƈ列D那些扩展名作为命令选项。例如:

python code2data.py py c java

您得到的是一?STDOUT 上的向量Q可以把q些向量输入到另一个进E或者重定向C个文Ӟ它的输出如下所C:


清单 4QCode2Data 的输出向?/strong>
0.15 0.01 0.01 0.04 0.07 0.00 0.00 0.03 0.01 0.00 0.00 0.00 0.05 0.00 > 1 0 0
0.14 0.00 0.00 0.05 0.13 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.13 0.00 > 1 0 0
[...]

让我们回忆一下输入值都是不同特D字W出现的规格化数目,目标|在大于号以后Q是 YES/NOQ它代表包含q些字符的源代码文g的类型,不过对于什么是什么来_q没有非常明昄东西。数字可以是输入或期望的 L?/em>Q这才是最重要的?

下一步是q行实际?code_recognizer.py E序。这需要(? STDIN 中)像上面一L向量集。这个程序有一个包Q它能够Ҏ实际文g推断出需要多输入节点(计算在内的和期望的)Q选择隐藏节点的数目是一个诀H。对于源代码的识别,6 ?8 个隐藏节点似乎工作得很好。如果打试验网l从而发现对于这些不同的选项它是如何做的Q您可以覆盖命o行中的所有参敎ͼ但每一ơ运行还是会耗费一些时间。值得注意的是Q? code_recognizer.py 它的(大的Q测试结果文件发送到 STDOUTQ而将一些友好的消息攑֜ STDERR 里。这样在大部分时间里Qؓ了安全保,您将会把 STDOUT 定向C个文Ӟq监视针对进E和l果概要?STDERR?/p>
清单 5Q运? code_recognizer.py
> code2data.py py c java | code_recognizer.py > test_results.txt 
Total bytes of py-source: 457729
Total bytes of c-source: 245197
Total bytes of java-source: 709858
Input set: ) ( _ . = ; " , ' * / { } : - 0 + 1 [ ]
HIDDEN = 8
LEARNRATE = 0.5
ITERATIONS = 1000
TRAINSIZE = 500
OUTPUTS = 3
MOMENTUM = 0.1
ERROR_CUTOFF = 0.01
TESTSIZE = 500
INPUTS = 20
error -> 95.519... 23.696... 19.727... 14.012... 11.058... 9.652...
8.858... 8.236... 7.637... 7.065... 6.398... 5.413... 4.508...
3.860... 3.523... 3.258... 3.026... 2.818... 2.631... 2.463...
2.313... 2.180... 2.065... 1.965... 1.877... 1.798... 1.725...
[...]
0.113... 0.110... 0.108... 0.106... 0.104... 0.102... 0.100...
0.098... 0.096... 0.094... 0.093... 0.091... 0.089... 0.088...
0.086... 0.085... 0.084...
Success rate against test data: 92.60%

不断减少误差是个很好的兆_q至在一D长旉里所获得的一U进步,且最后的l果必然是深入h心的。就我们的观点而言Q网l完成了一值得敬的工作,来识别代? ?我们会乐意們֐Q对于您的数字向量它是如何做的?



参考资?





Bill Hsu 2008-08-30 20:08 发表评论
]]>
stredit problemhttp://www.shnenglu.com/billhsu/archive/2008/08/01/57754.htmlBill HsuBill HsuFri, 01 Aug 2008 05:41:00 GMThttp://www.shnenglu.com/billhsu/archive/2008/08/01/57754.htmlhttp://www.shnenglu.com/billhsu/comments/57754.htmlhttp://www.shnenglu.com/billhsu/archive/2008/08/01/57754.html#Feedback0http://www.shnenglu.com/billhsu/comments/commentRss/57754.htmlhttp://www.shnenglu.com/billhsu/services/trackbacks/57754.htmlChange string s into string t in the least steps.
In each step you can insert or delete a char of the string.
INPUT n1 s
n2 t
n1 is the length of string s
n2 is the length of string t
OUT the least steps
exp:
INPUT 4 abcd
6 aefbhd
OUT 4
#include<iostream>
#include
<string>

using namespace std;

string s1,s2;
int map[100];
int i,j,result[100];
int n1,n2,nc;

int main(){
    cin
>>n1>>s1>>n2>>s2;
    nc
=0;
    
for (i=0;i<n1;i++){
        
if ((j=s2.find(s1[i]))>=0){
          map[nc]
=j;
          s2.replace(j,
1," ");
          nc
++;
          }
          }
    result[nc
-1]=1;
    
for (i=nc-2;i>=0;i--){
        
for (j=i+1;j<nc;j++if ((map[i]<map[j])&&(result[i]<result[j])) result[i]=result[j];
        result[i]
++;
        }
    j
=0;
    
for (i=0;i<nc;i++if(result[i]>j) j=result[i];
    cout
<<n1+n2-j-j;
    system(
"pause");
    
return 0;
}





Bill Hsu 2008-08-01 13:41 发表评论
]]>
矛_合ƈhttp://www.shnenglu.com/billhsu/archive/2008/07/24/57083.htmlBill HsuBill HsuThu, 24 Jul 2008 13:37:00 GMThttp://www.shnenglu.com/billhsu/archive/2008/07/24/57083.htmlhttp://www.shnenglu.com/billhsu/comments/57083.htmlhttp://www.shnenglu.com/billhsu/archive/2008/07/24/57083.html#Feedback0http://www.shnenglu.com/billhsu/comments/commentRss/57083.htmlhttp://www.shnenglu.com/billhsu/services/trackbacks/57083.html 在一个圆形操场的四周摆放着n堆石子。现要将矛_有次序地合ƈ成一堆。规定每ơ只能选相ȝ2堆石子合q成新的一堆,q将新的一堆石子数Cؓ该次合ƈ的得分。试设计一个算法,计算出将n堆石子合q成一堆的最得分和最大得分?br>
/*
   Name: Stone Problem
   Copyleft: www.graptor.com
   Author: Bill Hsu
   Date: 27-04-08 15:15
*/

#include 
<iostream>
#include 
<string>
#include 
<fstream>

#define MAX 100
#define MAXint 1000
using namespace std;

int i,j;//循环用的
ifstream in("in.txt");
ofstream 
out ("out.txt");
int f[MAX][MAX];//f[i][j]表示从i起取j堆的最大?/span>
int sum[MAX][MAX];//sum[i][j]表示从i起取j堆的?/span>
int num[MAX];

int main()
{
int n;
in >>n;
for(i=1;i<=n;i++)
{
in >>num[i];
sum[i][
1]=num[i];
f[i][
1]=0;
}
//end for

for (j=2;j<=n;++j)
{
cout 
<<endl<<j<<endl<<endl;
for(i=1;i<=n;++i)
{
cout 
<<(sum[i][j]=num[i]+sum[i%n+1][j-1])<<endl;

}
//end for i
}//end for j
int k,x,t;

for (j=2;j<=n;j++)
{
for(i=1;i<=n;i++)
{
f[i][j]
=MAXint;
t
=sum[i][j];
for(k=1;k<=j-1;k++)
{
x
=(i+k-1)%n+1;
if(f[i][k]+f[x][j-k]+t<f[i][j])
f[i][j]
=f[i][k]+f[x][j-k]+t;
}
//end for k
cout <<f[i][j]<<endl;
}
//end for i

}
//end for j

int tmp=f[1][n];
for(j=1;j<=n;++j)
{
if (f[j][n]<tmp)
tmp
=f[j][n];
}
//end for

cout 
<<tmp<<endl;

system(
"pause");
return 0;
}
//end main



Bill Hsu 2008-07-24 21:37 发表评论
]]>
能量whttp://www.shnenglu.com/billhsu/archive/2008/07/23/56947.htmlBill HsuBill HsuWed, 23 Jul 2008 07:37:00 GMThttp://www.shnenglu.com/billhsu/archive/2008/07/23/56947.htmlhttp://www.shnenglu.com/billhsu/comments/56947.htmlhttp://www.shnenglu.com/billhsu/archive/2008/07/23/56947.html#Feedback0http://www.shnenglu.com/billhsu/comments/commentRss/56947.htmlhttp://www.shnenglu.com/billhsu/services/trackbacks/56947.html NOIP2006的第一题?br> 在Mars星球上,每个Mars人都随n佩带着一串能量项链。在w上有N颗能量珠。能量珠是一颗有头标C标记的珠子Q这些标记对应着某个正整数。ƈ 且,对于盔R的两颗珠子,前一颗珠子的标C定等于后一颗珠子的头标记。因为只有这P通过吸盘Q吸盘是Mars人吸收能量的一U器官)的作用,q两? 珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为mQ尾标记为rQ后一颗能量珠的头标记为rQ尾标记为nQ则聚合? 释放的能量ؓm*r*nQMars单位Q,C生的珠子的头标记为mQ尾标记为n?br> 需要时QMars人就用吸盘夹住相ȝ两颗珠子Q通过聚合得到能量Q直到项链上只剩下一颗珠子ؓ止。显Ӟ不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项N攑և的总能量最大?br> 例如Q设N=4Q?颗珠子的头标C标Cơؓ(2Q?) (3Q?) (5Q?0) (10Q?)。我们用记号⊕表示两颗珠子的聚合操作,(j⊕k)表示WjQk两颗珠子聚合后所释放的能量。则W??两颗珠子聚合后释攄能量为:
(4⊕1)=10*2*3=60?br> q一串项铑֏以得到最优值的一个聚合顺序所释放的总能量ؓ
((4⊕1)⊕2)⊕3Q?10*2*3+10*3*5+10*5*10=710?br> 【输入文件?br> 输入文genergy.in的第一行是一个正整数NQ?≤N≤100Q,表示w上珠子的个数。第二行是N个用I格隔开的正整数Q所有的数均不超q? 1000。第i个数为第i颗珠子的头标讎ͼ1≤i≤NQ,当i<N< span>ӞWi颗珠子的标记应该等于第i+1颗珠子的头标记。第N颗珠子的标记应该等于第1颗珠子的头标记?br> 至于珠子的顺序,你可以这L定:项链放到桌面上Q不要出C叉,随意指定W一颗珠子,然后按顺旉方向定其他珠子的顺序?br> 【输出文件?br> 输出文genergy.out只有一行,是一个正整数EQE≤2.1*109Q,Z个最优聚合顺序所释放的总能量?br> 【输入样例?br> 4
2 3 5 10
【输出样例?br> 710
#include <iostream>
using   namespace std;
#define MAX 100
int n;//数量
int f[MAX][MAX];
int a[MAX];//a[i]为第i个珠子的?/span>
int k,i,j,r,tmp;
int max(int x,int y)
{
if (x>y) return x;
return y;
}
int main()
{
cin 
>>n;
for (i=0;i<n;++i)
{
cin 
>>a[i];
}
for(i=2;i<=n;i++)
for(j=0;j<n;j++)
{
k
=(i+j)%n;
for(r=1;r<i;r++)
f[j][k]
=max(f[j][(j+r)%n]+f[(j+r)%n][k]+a[j]*a[(j+r)%n]*a[k],f[j][k]);
}
tmp
=-1;
for(i=0;i<n;i++)
if(f[i][i]>tmp)tmp=f[i][i];
cout
<<tmp<<endl;
system(
"pause");
return 0;
}



Bill Hsu 2008-07-23 15:37 发表评论
]]>
很好的递推题:铺磁砖和走格?/title><link>http://www.shnenglu.com/billhsu/archive/2008/07/23/56948.html</link><dc:creator>Bill Hsu</dc:creator><author>Bill Hsu</author><pubDate>Wed, 23 Jul 2008 07:37:00 GMT</pubDate><guid>http://www.shnenglu.com/billhsu/archive/2008/07/23/56948.html</guid><wfw:comment>http://www.shnenglu.com/billhsu/comments/56948.html</wfw:comment><comments>http://www.shnenglu.com/billhsu/archive/2008/07/23/56948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/billhsu/comments/commentRss/56948.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/billhsu/services/trackbacks/56948.html</trackback:ping><description><![CDATA[<font color="#ff6600"><font color="#000000">q是</font></font>Matrix67.com的递推专项训练的题目,感觉很好?font color="#ff6600"><br> <br> *题一Q用1 x 1? x 2的磁砖不重叠地铺满N x 3的地板,共有多少U方案?<br> 样例输入Q?<br> 样例输出Q?</font><br> <br> 先设一个f[i]表示i*3的地杉K的方?f[1]=1;f[2]=3;<br> i*3的地板数是这样得到的Q?i-1)*3的地板比i*3的地板少的地方全Z1*1的瓷砖,q有一U铺法;<br> 或者在(i-2)*3的地板比i*3的地板少的地斚w?*2的瓷砖和2?*1的瓷砖,q有两种铺法Q?br> 所以得到递推式:<strong>f[i]=f[i-1]+2*f[i-2];</strong><br> <br> <font color="#ff6600"> *题二Q从原点出发Q一步只能向双、向上走或向左走。恰好走N步且不经q已走的点共有多种走法Q?br> 样例输入Q?<br> 样例输出Q?</font><br> <br> q个我没惛_来,看题解才弄明白。?br> 先设一个f[i]表示恰好走i步且不经q已走的?共有的走法?br> 如果向上赎ͼ不会出现l过已走的点Q如果向左或叻I上一步不能是向右或左?br> <br> 引用题解上的一句话Q?*<br> <font color="#999999"> q一步的选择? (3*上一步的所有选择中向上走的选择? + (2*上一步的所有选择中向左、右走的选择?。上一步的所有选择中向上走的选择?#8221;实际上就?#8220;上上步的所有选择?#8221;即d[i-2]<br> </font> */引用l束<br> <br> q有一点,是“上一步的所有选择中向左、右走的选择?#8221; {于 “上步所有的选择?即f[i-1])-上步向上的选择?#8221;<br> 也就{于 “上步所有的选择?即f[i-1])-上上步所有的选择?即f[i-2])”<br> 所以得到递推式:<strong>f[i] = (3*f[i-2]) + 2*(f[i-1]-f[i-2]);</strong><br> <br> 题解上共有五题,都很好,大家可以去这里看看:<br> http://www.fengzee.com/blog/article.asp?id=60 <img src ="http://www.shnenglu.com/billhsu/aggbug/56948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/billhsu/" target="_blank">Bill Hsu</a> 2008-07-23 15:37 <a href="http://www.shnenglu.com/billhsu/archive/2008/07/23/56948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.qlmoban.cn" target="_blank">ŷ鶹þþþþ</a>| <a href="http://www.meiguohongfeng.com.cn" target="_blank">պƷþþþþ</a>| <a href="http://www.nxyb.net.cn" target="_blank">ݺݾƷþþĻ </a>| <a href="http://www.jire1z.cn" target="_blank">þþƷоƷ</a>| <a href="http://www.http321.cn" target="_blank">ŷ޾ƷþþavӰ </a>| <a href="http://www.ebianlian.cn" target="_blank">þˬˬAV</a>| <a href="http://www.lingxiu98.com.cn" target="_blank">ŷһþþƷ</a>| <a href="http://www.meiguohongfeng.com.cn" target="_blank">þþƷһպ </a>| <a href="http://www.ehrmfye.cn" target="_blank">9999Ʒŷþþþþ</a>| <a href="http://www.gzjrbs.cn" target="_blank">ѹ99þþ㽶</a>| <a href="http://www.hbxasn.cn" target="_blank">Ʒ˾þþþþþ</a>| <a href="http://www.yrwe981.cn" target="_blank">þþžžþƷֱ</a>| <a href="http://www.75063.com.cn" target="_blank">þۺϾþ</a>| <a href="http://www.51peini.cn" target="_blank">ݺɫþۺ</a>| <a href="http://www.7788797.cn" target="_blank">þþavҰһ</a>| <a href="http://www.shopzoom.cn" target="_blank">˾Ʒþ</a>| <a href="http://www.shufa520.cn" target="_blank">ƷŮþþþAV</a>| <a href="http://www.u3h1.cn" target="_blank">þ99ƷþþþþҰ</a>| <a href="http://www.vjqm.cn" target="_blank"> þ Ʒ</a>| <a href="http://www.xkot.cn" target="_blank">97ȾþƵƷ99</a>| <a href="http://www.generalpaint.com.cn" target="_blank">þþþ޾Ʒ</a>| <a href="http://www.hunxueer.cn" target="_blank">þñѵӰˬˬˬ</a>| <a href="http://www.markey.com.cn" target="_blank">޳ɫ999þվ</a>| <a href="http://www.fuhuazhan.cn" target="_blank">ƷһþþƷ</a>| <a href="http://www.hwhack.cn" target="_blank">þƵ</a>| <a href="http://www.eboa.com.cn" target="_blank">þþƷAV뽿ɫ </a>| <a href="http://www.coubu.cn" target="_blank">þþƷ</a>| <a href="http://www.hktjj.cn" target="_blank">ھƷ˾þþӰԺ</a>| <a href="http://www.h8uq0.cn" target="_blank">þþƷר</a>| <a href="http://www.zhaobiao365.cn" target="_blank">Ʒ۲ӰԺþ</a>| <a href="http://www.021cp.cn" target="_blank">þۺɫһ</a>| <a href="http://www.smsunion.cn" target="_blank">þ99ھƷ</a>| <a href="http://www.zhuangzhua.cn" target="_blank">þù׾Ʒҹ</a>| <a href="http://www.niuhongtao.cn" target="_blank">þþþþۺ</a>| <a href="http://www.51lol.cn" target="_blank">˾þƵ</a>| <a href="http://www.toy365.cn" target="_blank">99þùƷһ</a>| <a href="http://www.deartaobao.cn" target="_blank">þþƷž޾Ʒ</a>| <a href="http://www.msve.cn" target="_blank">2021ƷþþƷ</a>| <a href="http://www.vufh.cn" target="_blank">ƷˮҾþþþþþ</a>| <a href="http://www.aisile.com.cn" target="_blank">þۺɫ </a>| <a href="http://www.sspfn.cn" target="_blank">þݺҹҹ2O2O</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>