﻿<?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>博客园-一切随心</title><link>http://www.cnblogs.com/drizzlecrj/</link><description>编程菜园</description><language>zh-cn</language><lastBuildDate>Sun, 20 Jul 2008 21:34:47 GMT</lastBuildDate><pubDate>Sun, 20 Jul 2008 21:34:47 GMT</pubDate><ttl>60</ttl><item><title>TC 泛黄了</title><link>http://www.cnblogs.com/drizzlecrj/archive/2008/06/05/1214721.html</link><dc:creator>农夫三拳</dc:creator><author>农夫三拳</author><pubDate>Thu, 05 Jun 2008 13:04:00 GMT</pubDate><guid>http://www.cnblogs.com/drizzlecrj/archive/2008/06/05/1214721.html</guid><wfw:comment>http://www.cnblogs.com/drizzlecrj/comments/1214721.html</wfw:comment><comments>http://www.cnblogs.com/drizzlecrj/archive/2008/06/05/1214721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/drizzlecrj/comments/commentRss/1214721.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/drizzlecrj/services/trackbacks/1214721.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 终于泛黄了，唉，还是很弱。
<img src ="http://www.cnblogs.com/drizzlecrj/aggbug/1214721.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41218/" target="_blank">[新闻]Firefox 社区向 Opera 标准教程示好</a>]]></description></item><item><title>Introduction to String Searching Algorithms--Rabin-Karp and Knuth-Morris-Pratt Algorithms [翻译] </title><link>http://www.cnblogs.com/drizzlecrj/archive/2008/06/03/1212755.html</link><dc:creator>农夫三拳</dc:creator><author>农夫三拳</author><pubDate>Tue, 03 Jun 2008 05:11:00 GMT</pubDate><guid>http://www.cnblogs.com/drizzlecrj/archive/2008/06/03/1212755.html</guid><wfw:comment>http://www.cnblogs.com/drizzlecrj/comments/1212755.html</wfw:comment><comments>http://www.cnblogs.com/drizzlecrj/archive/2008/06/03/1212755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/drizzlecrj/comments/commentRss/1212755.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/drizzlecrj/services/trackbacks/1212755.html</trackback:ping><description><![CDATA[摘要: Introduction to String Searching AlgorithmsRabin-Karp and Knuth-Morris-Pratt Algorithms 【原文见： http://www.topcoder.com/tc?module=Static&amp;d1=tutorials&amp;d2=stringSearching】作者：ByTheLlamaTopcoder Mem&nbsp;&nbsp;<a href='http://www.cnblogs.com/drizzlecrj/archive/2008/06/03/1212755.html'>阅读全文</a><img src ="http://www.cnblogs.com/drizzlecrj/aggbug/1212755.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41217/" target="_blank">[新闻]商总局称对网店新规将全国推广不知情</a>]]></description></item><item><title>TopCoder C# User List</title><link>http://www.cnblogs.com/drizzlecrj/archive/2008/05/29/1210201.html</link><dc:creator>农夫三拳</dc:creator><author>农夫三拳</author><pubDate>Thu, 29 May 2008 10:26:00 GMT</pubDate><guid>http://www.cnblogs.com/drizzlecrj/archive/2008/05/29/1210201.html</guid><wfw:comment>http://www.cnblogs.com/drizzlecrj/comments/1210201.html</wfw:comment><comments>http://www.cnblogs.com/drizzlecrj/archive/2008/05/29/1210201.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/drizzlecrj/comments/commentRss/1210201.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/drizzlecrj/services/trackbacks/1210201.html</trackback:ping><description><![CDATA[<p>注: 排名不分先后，有些人会有一些备注，这些备注是我认为应当学习或者注意的东东。 名单的人以rating&gt;=1500的居多，并不完全。<br />
<br />
<font face="Verdana">Yarin&nbsp; <strong>(Network 网络流类, BigInt 大整数类)<br />
</strong><font face="Verdana">HiltonLange&nbsp; <strong>(VB user)<br />
</strong>WSX&nbsp; <strong>(无)</strong><br />
futo&nbsp; <strong>(string.Format("{0:0.00000}", r);&nbsp; static int [] VI(params int[] x) { return x; } )<br />
</strong>jthread&nbsp; <strong>(计算几何相关的类, PriorityQueue)<br />
</strong>zjq&nbsp; <strong>(Dictionary&lt;T1, T2&gt;.KeyCollection)<br />
</strong>timmac&nbsp; <strong>(打表，枚举)<br />
</strong>Larry&nbsp; <strong>(java user)<br />
</strong><span style="color: red"><font face="Verdana">aussie&nbsp;<strong> (IEnumerable , Enumerator,&nbsp; yield,&nbsp; Math.Sign , Array.ConvertAll 双重 , delegate , Predicate , Converter, </strong></font><font face="Verdana"><strong>StringComparer ) </strong></font></span></font><font face="Verdana"><br />
sjelkjd&nbsp;<strong> (line直线类, segment线段类)<br />
</strong>vanessa&nbsp; <strong>(无)<br />
</strong>aktayv&nbsp;<strong> (无)<br />
</strong>unnonouno&nbsp; <strong>(无)<br />
</strong>evgeni&nbsp; <strong>(无)<br />
</strong>zig2&nbsp; <strong>(实体类)<br />
</strong>cryst&nbsp;<strong> (无)<br />
</strong>TAG&nbsp; <strong>(System.Drawing.Rectangle, System.Drawing.Point&nbsp;, SQR, DateTime, TimeSpan)<br />
</strong>alexilic&nbsp; <strong>(无)<br />
</strong>Mojito1&nbsp; <strong>(Array.Clone() as int[], 代码紧凑，String.TrimEnd 包括参数)<br />
</strong>greatvict&nbsp; <strong>(BitArray List.FindLastIndexOf)<br />
</strong>bann-andrej&nbsp;<strong> (无)<br />
</strong>alphastream&nbsp; <strong>(hash函数, LinkedList&lt;T&gt;, double.PositiveInfinity, s.Split(" ".ToCharArray()), BitArray)<br />
</strong>superkinhluan&nbsp; <strong>(readonly, IEquatable, using Point = Pair&lt;int,int&gt;, Array.BinarySearch)<br />
</strong>int9&nbsp; <strong>(Dictionary&lt;T1, T2&gt;.TryGetValue)<br />
</strong>modenl&nbsp;<strong> (long?[,] dp, goto)</strong><br />
DNNX&nbsp; <strong>(Converter&lt;T1,T2&gt;, Compaision&lt;T&gt;)<br />
</strong>goldfinch&nbsp; <strong>(无)<br />
</strong>MRoizner&nbsp; <strong>(DateTime,&nbsp; Comparison)<br />
</strong>indifferent <strong>(实体类与题目绑定便于理解, 用bfs写dfs)<br />
</strong>redclude&nbsp; <strong>(无)<br />
</strong>sinaddcos&nbsp;<strong> (C#中C++的头)<br />
</strong>LampJinn&nbsp; <strong>(最大流)<br />
</strong>szsz&nbsp; <strong>(函数的变量名随便起, List.Contains)</strong><br />
ysn&nbsp;<strong> (Pair类)<br />
</strong>s-vladimir&nbsp; <strong>(无)<br />
</strong>Jarlax&nbsp; <strong>(yield, IEnumerable&lt;int&gt;)<br />
</strong>kanliang&nbsp; <strong>(StringBuilder)<br />
</strong>bySerge&nbsp; <strong>(无)<br />
</strong>Majce&nbsp;<strong> (无)<br />
</strong>MicroBee&nbsp;<strong> (无)<br />
</strong>TheHedgehog&nbsp; <strong>(把C#当作C++用- -)<br />
</strong>dfyz&nbsp; <strong>(SortedPermutationGenerator&lt;T&gt;, checked, try, OverflowException, bitwise, Array.FindAll, </strong></font><font face="Verdana"><strong>list.RemoveAll,list.FindAll, 分数类)<br />
</strong>NetCoderCN&nbsp; <strong>(mess code- -)<br />
</strong>fox1981&nbsp; <strong>(无)<br />
</strong>ivan.pomelo&nbsp;<strong> (Comparsion&lt;T&gt;)<br />
</strong>_vs_&nbsp; <strong>(无)<br />
</strong>serine&nbsp; <strong>(Array.ConvertAll)<br />
</strong>Apokrif&nbsp; <strong>(string.IndexofAny string.PadLeft)<br />
</strong>ibommisetty&nbsp; <strong>(PriorityQueue)<br />
</strong>abi20sg&nbsp; <strong>(Regex, delegate 语法多变)<br />
</strong>SPY_L&nbsp;&nbsp; <strong>(using X = System.Math&nbsp;, CompareTo)<br />
</strong><br />
比较喜欢看aussie的代码:-)</font></p>
</font>
<img src ="http://www.cnblogs.com/drizzlecrj/aggbug/1210201.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41216/" target="_blank">[新闻]中信信用卡网站已经撤下支付宝充值收取手续费的通知</a>]]></description></item><item><title>TCHS SRM 1</title><link>http://www.cnblogs.com/drizzlecrj/archive/2008/04/14/1153511.html</link><dc:creator>农夫三拳</dc:creator><author>农夫三拳</author><pubDate>Mon, 14 Apr 2008 15:33:00 GMT</pubDate><guid>http://www.cnblogs.com/drizzlecrj/archive/2008/04/14/1153511.html</guid><wfw:comment>http://www.cnblogs.com/drizzlecrj/comments/1153511.html</wfw:comment><comments>http://www.cnblogs.com/drizzlecrj/archive/2008/04/14/1153511.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/drizzlecrj/comments/commentRss/1153511.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/drizzlecrj/services/trackbacks/1153511.html</trackback:ping><description><![CDATA[<span><span style="color: red"><strong><font face="Verdana">http://www.topcoder.com/tc?module=Static&amp;d1=hs&amp;d2=match_editorials&amp;d3=hs_srm1</font><br />
题解:<br />
</strong>1.&nbsp;&nbsp; <a href="http://www.topcoder.com/stat?c=problem_statement&amp;pm=6474&amp;rd=10022">SpeedRadar<br />
</a>&nbsp;&nbsp;&nbsp;&nbsp;水题<br />
2.&nbsp; &nbsp;<a href="http://www.topcoder.com/stat?c=problem_statement&amp;pm=6474&amp;rd=10022">SymbolFrequency<br />
</a>&nbsp;&nbsp;&nbsp;&nbsp;模拟<br />
3.&nbsp;&nbsp; <a href="http://www.topcoder.com/stat?c=problem_statement&amp;pm=6441&amp;rd=10022">TrotownKeeper</a><br />
i)&nbsp; &nbsp;如果直接做，可以对迷宫的四周的'.'的位置进行dfs，并进行标记，<br />
最后再用二重循环检查每一个'#'，如果与它相邻的部分超过了边界或者是已经<br />
标记过的'.',则将总的paint数目增加1<br />
ii)&nbsp;&nbsp; 比较好的做法是在迷宫的一周增加'.'，这样总的paint数目其实就是从(0,0)开始在dfs过程中<br />
碰到的'#'的数目。<strong>这个"加圈"的做法是一个经常使用的技巧。</strong></span><br />
<br />
<span style="color: #000000"><span style="color: #008000"><strong>总结:<br />
</strong>1.&nbsp; 在需要进行强制转化成double的时候，可以用*1.0或者+0.0的小技巧<br />
2.&nbsp; 在不需要下标操作的时候，foreach打字要比for少一点<br />
3.&nbsp; 通常在知道范围在'a'-'z'或者'A'-'Z'的时候，用int []要比<font style="color: #008000" face="Verdana" color="#ff0000">Dictionary&lt;char, int&gt;要方便一点<br />
</font>4.&nbsp; C#中的string 不好修改其中的元素值, 例如: string a = "China"; a[0] = 'c';<br />
5.&nbsp; 成员变量在函数调用前记得初始化, 这个在用TZTester的时候要注意<br />
<br />
</span><span style="color: #0000ff">这个算是我最近开始训练的一个标志吧，发现好久不做题，手生的不得了。刀要磨，脑也要转转~<br />
</span></span></span>
<img src ="http://www.cnblogs.com/drizzlecrj/aggbug/1153511.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41215/" target="_blank">[新闻]Windows 95主设计师皈依Mac</a>]]></description></item><item><title>Survey over pattern string match algorithm[6 items updated &amp;&amp; to be continued]</title><link>http://www.cnblogs.com/drizzlecrj/archive/2008/03/16/1108747.html</link><dc:creator>农夫三拳</dc:creator><author>农夫三拳</author><pubDate>Sun, 16 Mar 2008 13:21:00 GMT</pubDate><guid>http://www.cnblogs.com/drizzlecrj/archive/2008/03/16/1108747.html</guid><wfw:comment>http://www.cnblogs.com/drizzlecrj/comments/1108747.html</wfw:comment><comments>http://www.cnblogs.com/drizzlecrj/archive/2008/03/16/1108747.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/drizzlecrj/comments/commentRss/1108747.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/drizzlecrj/services/trackbacks/1108747.html</trackback:ping><description><![CDATA[<font face="Verdana">1. BM算法<br />
&nbsp;<strong>R S Boyer, J S Moo re. A fast string searching algorithm. Communications of the ACM , 1977, 20 (10) : <font face="Verdana">762 - 772.</font><br />
</strong><font face="Verdana"><a href="http://www.cs.utexas.edu/~moore/publications/fstrpos.pdf"><font face="Verdana">http://www.cs.utexas.edu/~moore/publications/fstrpos.pdf</font></a><br />
</font><br />
2. QS算法&nbsp;MS算法 OM算法 <font face="Verdana">　<br />
<strong>Sunday D M. A very fast substring search algorithm [J ]. Commun ACM , 1990, 33 (8) : 132- 142.</strong></font><br />
</font><a href="http://delivery.acm.org/10.1145/80000/79184/p132-sunday.pdf?key1=79184&amp;key2=8561485021&amp;coll=GUIDE&amp;dl=GUIDE&amp;CFID=59816834&amp;CFTOKEN=49045422">http://delivery.acm.org/10.1145/80000/79184/p132-sunday.pdf?key1=79184&amp;key2=8561485021&amp;coll=GUIDE&amp;dl=GUIDE&amp;CFID=59816834&amp;CFTOKEN=49045422</a> <br />
3. Hash判断一个串是否为另外一个串的子串&nbsp;&nbsp;&nbsp; <br />
<strong>Harrison, M.C. Implementation of the substring test by hashing , Comm. ACM , 1971, 777-779<br />
</strong><a href="http://portal.acm.org/ft_gateway.cfm?id=362934&amp;type=pdf&amp;coll=GUIDE&amp;dl=&amp;CFID=59935127&amp;CFTOKEN=56312585">http://portal.acm.org/ft_gateway.cfm?id=362934&amp;type=pdf&amp;coll=GUIDE&amp;dl=&amp;CFID=59935127&amp;CFTOKEN=56312585</a> <br />
<br />
4. DFSA算法<br />
<strong><font face="Verdana">Aho AV , Corasick M J. Efficient string matching: an aid to bibliographic search [J ]. Communication of the ACM , 1975, 18 (6) : 333～ 340</font><br />
</strong><a href="http://portal.acm.org/ft_gateway.cfm?id=360855&amp;type=pdf&amp;coll=GUIDE&amp;dl=GUIDE,&amp;CFID=60102753&amp;CFTOKEN=28811006">http://portal.acm.org/ft_gateway.cfm?id=360855&amp;type=pdf&amp;coll=GUIDE&amp;dl=GUIDE,&amp;CFID=60102753&amp;CFTOKEN=28811006</a> <br />
5. Rabin-Karp 算法<br />
<span class="a"><strong>RM Karp, MO Rabin - An Efficient randomized pattern-matching algorithms,&nbsp; JRD. </strong><span class="mediumb-text"><strong>IBM, 1987,249-260<br />
</strong></span></span><a href="http://www.research.ibm.com/journal/rd/312/ibmrd3102P.pdf">http://www.research.ibm.com/journal/rd/312/ibmrd3102P.pdf</a> <br />
<br />
6. FS算法<br />
<font face="Verdana"><strong>FAN Jang2jong, SUKeh2yih. An efficient algorithm for match multiple patterns [ J ]. IEEE Trans on Knowledge and Data Engineering, 1993, 5 (2) : 339- 351.<br />
<a href="http://ieeexplore.ieee.org/iel3/69/5754/00219740.pdf?tp=&amp;isnumber=&amp;arnumber=219740">http://ieeexplore.ieee.org/iel3/69/5754/00219740.pdf?tp=&amp;isnumber=&amp;arnumber=219740</a></strong></font>
<img src ="http://www.cnblogs.com/drizzlecrj/aggbug/1108747.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41214/" target="_blank">[新闻]iPhone Dev Team 正式释出 PwnageTool 2.0</a>]]></description></item><item><title>图象处理基本算法[整理]</title><link>http://www.cnblogs.com/drizzlecrj/archive/2008/02/25/1077494.html</link><dc:creator>农夫三拳</dc:creator><author>农夫三拳</author><pubDate>Mon, 25 Feb 2008 12:48:00 GMT</pubDate><guid>http://www.cnblogs.com/drizzlecrj/archive/2008/02/25/1077494.html</guid><wfw:comment>http://www.cnblogs.com/drizzlecrj/comments/1077494.html</wfw:comment><comments>http://www.cnblogs.com/drizzlecrj/archive/2008/02/25/1077494.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/drizzlecrj/comments/commentRss/1077494.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/drizzlecrj/services/trackbacks/1077494.html</trackback:ping><description><![CDATA[<p><font face="Verdana"><br />
<strong>1)</strong>将256*256分辨率的图像变为128*128分辨率可以将源图像划分成2*2的子图像块,然后将2*2的</font></p>
<p><font face="Verdana">子图像块的所有像素颜色均按照F(i,j)的颜色值进行设定，达到降低分辨率的目的。<br />
如:<br />
F(i,j)&nbsp;&nbsp;&nbsp; F(i,j+1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F(i,j)&nbsp; F(i,j) <br />
F(i+1,j)&nbsp; F(i+1,j+1)&nbsp;&nbsp; 变成&nbsp;&nbsp; F(i,j)&nbsp; F(i,j)<br />
（同理，256*256分辨率的图像变成64*64分辨率，只需要划分成4*4即可，以此类推。）<br />
<br />
<strong>2)</strong> R单色, G单色,B单色化图像，只需要将图像的每一个像素中的相应的R, G, B值取出，然后利用类似<br />
(R,R,R),(G,G,G),(B,B,B)的像素重新绘制即可。<br />
<br />
<strong>3)</strong> 彩色图像的RGB和亮度Y，色差I，信号值Q的关系<br />
| Y |&nbsp;&nbsp;&nbsp; |0.31&nbsp; 0.59&nbsp; 0.11&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; | R |<br />
| I&nbsp;| =&nbsp; |0.60 -0.28&nbsp; -0.32 | * | G |<br />
|Q |&nbsp;&nbsp;&nbsp;&nbsp; |0.21&nbsp; -0.52 -0.31 |&nbsp;&nbsp;&nbsp; | B |<br />
<br />
即&nbsp; Y = 0.31R + 0.59G+0.11B<br />
&nbsp;&nbsp;&nbsp;&nbsp; I&nbsp; =&nbsp;0.60R - 0.28G - 0.32B<br />
&nbsp;&nbsp;&nbsp;&nbsp; Q = 0.21R - 0.52B - 0.31B<br />
<br />
<strong>4)</strong>&nbsp; <strong>彩色图像的逆反处理：</strong> 将对应的(R, G, B)像素替换成(255 - R, 255 - G, 255 - B)<br />
&nbsp;&nbsp;&nbsp;&nbsp; <strong>彩色图像的平滑处理:</strong>&nbsp;&nbsp; 将一个图片每一个像素的颜色由其相邻的n*n个像素的平均值来替代。例如，将一个3*3的点阵，设带平滑的像素为f(i, j),平滑后为g(i, j)，那么<br />
f(i-1,j-1)&nbsp; f(i-1,j)&nbsp; f(i-1,j+1)<br />
f(i,j-1)&nbsp;&nbsp;&nbsp;&nbsp; f(i,j)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f(i,j+1)<br />
f(i+1,j-1) f(i+1,j)&nbsp; f(i+1,j+1)<br />
<br />
g(i,j)=( f(i-1,j-1) + f(i-1,j) + f(i-1,j+1) + f(i,j-1) + f(i,j) + f(i,j+1) + f(i+1,j-1) + f(i+1,j) + f(i+1,j+1) ) / 9<br />
<br />
这里要注意的是对于边缘的像素的情况，防止越界。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>彩色图像的霓虹处理:</strong>&nbsp;&nbsp; 同样以上面的3*3的点阵为例，目标像素g(i,j)应当以f(i,j)与f(i,j+1)，f(i,j)与f(i+1,j)的梯度作为R,G,B分量，我们不妨设f(i,j)的RGB分量为(r1, g1, b1), f(i,j+1)为(r2, g2, b2), f(i+1,j)为(r3, g3, b3), g(i, j)为(r, g, b),那么结果应该为<br />
r = 2 * sqrt( (r1 - r2)^2 + (r1 - r3)^2 )<br />
g = 2 * sqrt( (g1 - g2)^2 + (g1 - g3)^2 )<br />
b&nbsp;= 2 * sqrt( (b1 - b2)^2 + (b1 - b3)^2 )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>彩色图像的锐化处理:</strong>&nbsp;&nbsp;设f(i,j)像素为(r1, g1, b1) , f(i-1,j-1)像素为(r2,g2,b2), g(i,j)像素为(r,g,b),则<br />
r = r1 + 0.25 * |r1 - r2|<br />
g = g1 + 0.25 * |g1 - g2|<br />
b = b1 + 0.25 * |b1 - b2|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>彩色图像的浮雕处理:</strong>&nbsp;&nbsp;g(i, j) = f(i, j) - f(i - 1, j) + 常数&nbsp;， 这里的常数通常选作128<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>彩色图像的镶嵌处理:</strong>&nbsp;&nbsp;与<strong>彩色图像的平滑处理</strong>类似，但是不同的地方在于3*3的目标像素点都取作g(i,j)，而不是另外的再去取所在矩阵像素的平均值。<br />
&nbsp;&nbsp;&nbsp;&nbsp; <strong>彩色图像的灰度处理:</strong>&nbsp;&nbsp;r = r1 / 64 * 64&nbsp; g = g1 / 64 * 64&nbsp; b = b1 / 64 * 64&nbsp; 注意这里的除法是程序设计当中的整数除法。<br />
<br />
<strong>5)</strong> 图象的几何变换：平移，缩放，旋转等均于解析几何当中的保持一致。<br />
<br />
<strong>6)</strong>&nbsp;图象的滤波处理<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">● </span>卷积滤波 原理是 y(n1, n2)=<span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">∑</span><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">∑</span>x(m1,m2)h(n1-m1,n2-m2)&nbsp; (两个求和符号的范围分别是&nbsp;m1:0~N m2:0~N)<br />
其中x(m1,m2)为输入图像信号,h(n1-m1,n2-m2)为滤波系统对单位采样序列<span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&#948;</span>(n1,n2)的响应。 <br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp; ⊙低通滤波&nbsp; 一般而言，图像中的噪声频谱位于空间频率较高的区域，空间域低通滤波用于平滑噪声。常用低通滤波的<br />
</span><font face="宋体">h(n1, n2) 的3*3阵列如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/9&nbsp;&nbsp; 1/9&nbsp;&nbsp; 1/9<br />
</font>h(n1, n2) =&nbsp;&nbsp; 1/9&nbsp;&nbsp;&nbsp; 1/9&nbsp;&nbsp; 1/9<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/9&nbsp;&nbsp;&nbsp; 1/9&nbsp;&nbsp;&nbsp; 1/9<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/10&nbsp;&nbsp; 1/10&nbsp;&nbsp; 1/10<br />
h(n1, n2) =&nbsp;&nbsp; 1/10&nbsp;&nbsp;&nbsp; 2/10&nbsp;&nbsp; 1/10<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/10&nbsp;&nbsp;&nbsp; 1/10&nbsp;&nbsp;&nbsp; 1/10&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/16&nbsp;&nbsp; 1/8&nbsp;&nbsp; 1/16<br />
h(n1, n2) =&nbsp;&nbsp; 1/8&nbsp;&nbsp;&nbsp;&nbsp;1/4&nbsp;&nbsp; 1/8<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/16&nbsp;&nbsp;&nbsp; 1/8&nbsp;&nbsp;&nbsp; 1/16<br />
采用5*5阵列低通滤波h(n1,n2)如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/35&nbsp; 1/35&nbsp; 1/35&nbsp; 1/35&nbsp; 1/35<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/35&nbsp; 2/35&nbsp; 2/35&nbsp; 2/35&nbsp; 1/35<br />
h(n1, n2)&nbsp; =&nbsp;&nbsp; 1/35&nbsp; 2/35&nbsp; 3/35&nbsp; 2/35&nbsp; 1/35&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; 1/35&nbsp; 2/35&nbsp; 2/35&nbsp; 2/35&nbsp; 1/35&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/35&nbsp; 1/35&nbsp; 1/35&nbsp; 1/35&nbsp; 1/35&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp; ⊙高通滤波&nbsp;&nbsp; 空域高通滤波是对图像的低频分量进行拟制，让图像的高频分量无损耗或者低损耗的通过。空域高通滤波常用的h(n1,n2)的如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; -1&nbsp;&nbsp; 0<br />
h(n1, n2) =&nbsp; -1&nbsp;&nbsp; 5&nbsp;&nbsp; -1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp; -1&nbsp;&nbsp; -1<br />
h(n1, n2) =&nbsp; -1&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp; -1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp; -1&nbsp;&nbsp; -1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp; -2&nbsp;&nbsp; 1<br />
h(n1, n2) =&nbsp; -2&nbsp;&nbsp; 5&nbsp;&nbsp; -2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; -2&nbsp;&nbsp; 1<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">● </span>增强处理&nbsp;&nbsp;<br />
&nbsp; ⊙&nbsp;&nbsp; 水平增强&nbsp; 增强图像水平方向线条也是一种高通滤波。水平增强的h(n1, n2)的例子如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 0<br />
h(n1, n2) =&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp; 2&nbsp;&nbsp;-1<br />
&nbsp; ⊙&nbsp;&nbsp; 垂直增强&nbsp; 增强图像垂直方向线条也是一种高通滤波。水平增强的h(n1, n2)的例子如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 0<br />
h(n1, n2) =&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp; 0&nbsp;&nbsp; 0<br />
&nbsp; ⊙&nbsp;&nbsp; 水平垂直增强&nbsp; 水平垂直增强图像也是一种高通滤波。水平增强的h(n1, n2)的例子如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp; -1<br />
h(n1, n2) =&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp; -1<br />
<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;</span>结构滤波&nbsp;&nbsp;<br />
&nbsp;⊙&nbsp;&nbsp; 并联型结构滤波<br />
结构如图:<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/parallel.jpg" border="0" /><br />
例如，当<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 0<br />
h1(n1, n2) =&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp; 2&nbsp;&nbsp;-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 0<br />
h2(n1, n2) =&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp; 0&nbsp;&nbsp; 0<br />
则h(n1, n2)为<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 0<br />
h(n1, n2) =&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp; 2&nbsp;&nbsp; -1<br />
&nbsp;⊙&nbsp;&nbsp; 串联型结构滤波<br />
结构如图:<br />
<img height="46" alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/series.jpg" width="371" border="0" /><br />
<br />
例如，当<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 0<br />
h1(n1, n2) =&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp; 2&nbsp;&nbsp;-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 0<br />
h2(n1, n2) =&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp; 0&nbsp;&nbsp; 0<br />
则h(n1, n2)为<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;-2&nbsp;&nbsp; 1<br />
h(n1, n2) =&nbsp;&nbsp;-2&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;-2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;1&nbsp;&nbsp; -2&nbsp;&nbsp; 1<br />
<br />
<strong>7)</strong>&nbsp;图象的切换特效处理<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;</span>上部和下部对接显示<br />
只需要不断的同时描绘对称的上部和下部的一行像素即可<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;左</span>部和右部对接显示<br />
只需要不断的同时描绘对称的左部和右部的一列像素即可<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;四边向中央</span>显示<br />
只需要不断的同时等进阶的描绘四边直至描绘到中心点即可<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;中央向四边</span>显示<br />
只需要不断的从中心点同时等进阶的描绘四边直至描绘到边缘即可<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;四角向中心</span>显示<br />
从左上角，右下角分别同时沿着主对角线等进阶的描绘自己所在像素的行，列像素直至中心<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;水平删条</span><br />
设定分割长度L， 然后分别从高度为L, 2L, 3L ... 处等进阶的描绘行像素，显然这里进阶所需描绘高度为L<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;垂直删条</span><br />
设定分割长度L， 然后分别从宽度为L, 2L, 3L ... 处等进阶的描绘列像素，显然这里进阶所需描绘宽度为L<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;由左向右（由右向左）<br />
分别从左至右(从右至左)不断的描绘列像素直至边缘<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;由上向下（由下向上）<br />
分别由上向下（由下向上）不断的描绘行像素直至边缘<br />
</span><br />
<strong>8)</strong>&nbsp;边缘探测<br />
</span>在图像测量，模式识别时，从图像中抽出线条，检测出图像边缘或者抽出图像轮廓是最常用的操作。迄今为止，已经出现了许多成熟的算法。例如微分算法，掩模算法等。在微分算法中，常使用N*N的像素块，例如3*3或者4*4。3*3的像素块如下，<br />
f(i-1,j-1)&nbsp; f(i-1,j)&nbsp; f(i-1,j+1)<br />
f(i,j-1)&nbsp;&nbsp;&nbsp;&nbsp; f(i,j)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f(i,j+1)<br />
f(i+1,j-1) f(i+1,j)&nbsp; f(i+1,j+1)<br />
我们不妨设f(i,j)为待处理的像素，而g(i, j)为处理后的像素。<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;Roberts算子<br />
</span>g(i, j) = sqrt( (f(i, j) - f(i + 1, j))^2 + (f(i + 1, j) - f(i, j + 1))^2 )<br />
或者<br />
g(i, j) = |f(i,j) - f(i + 1,j)| + |f(i+1,j) - f(i,j+1)|<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;Sobel算子</span><br />
<font face="Verdana">对数字图像的每一个像素f(i,j),考察它的上、下、左、右邻域灰度的加权值，把各方向上(0度、45度、90度、135度)的灰度值加权之和作为输出，可以达到提取图像边缘的效果。<br />
即 g(i,j) = fxr + fyr, 其中<br />
fxr = f(i-1,j-1)+2*f(i-1,j)+f(i-1,j+1)-f(i+1,j-1)-2*f(i+1,j)-f(i+1,j+1)<br />
fyr = f(i-1,j-1)+2*f(i,j-1)+f(i+1,j-1)-f(i-1,j+1)-2*f(i,j+1)-f(i+1,j+1)</font><br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;Laplace算子<br />
</span><font face="Verdana">Laplace算子是一种二阶微分算子。它有两种形式:4邻域微分算子和8邻域微分算子。<br />
</font></p>
<p><font face="Verdana"></font>&nbsp;⊙&nbsp;&nbsp; 4邻域微分<br />
g(i,j)=|4*f(i,j)-f(i,j-1)-f(i-1,j)-f(i+1,j)-f(i,j+1)|<br />
&nbsp;⊙&nbsp;&nbsp; 8邻域微分<br />
g(i,j)=|8*f(i,j)-f(i,j-1)-f(i-1,j)-f(i+1,j)-f(i,j+1)-f(i-1,j-1)-f(i-1,j+1)-f(i+1,j-1)-f(i+1,j+1)|<br />
<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;其他常用算子<br />
&nbsp;⊙&nbsp;&nbsp; 右下边缘抽出<br />
</span>采用3*3算子时，表达式为<br />
g(i,j)=|-2*f(i,j-1)-2*f(i-1,j)+2*f(i+1,j)+2*f(i,j+1)|<br />
&nbsp;⊙&nbsp;&nbsp; prewitt 边缘探测样板算子<br />
prewitt算子是一个边缘模板算子，由八个方向的样板组成，能够在0度，45度，90度，135度，180度，225度角<br />
等八个方向检测边缘。8个3*3边缘模板及方向如下：<br />
90度角:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 45度角:<br />
1&nbsp;&nbsp; 1&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp; -1&nbsp; -1<br />
1&nbsp; -2&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; -2&nbsp;&nbsp; 1<br />
-1 -1 -1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; 1&nbsp;&nbsp; 1<br />
0度角:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 315度角:<br />
-1&nbsp;&nbsp; 1&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; 1&nbsp;&nbsp; -1<br />
-1&nbsp; -2&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; -2&nbsp;&nbsp; -1<br />
-1&nbsp;&nbsp; 1&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; 1&nbsp;&nbsp; -1<br />
270度角：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 225度角:<br />
1&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp; -1&nbsp; 1<br />
-1&nbsp; -2 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp; -2&nbsp;&nbsp; 1<br />
-1&nbsp;-1&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; 1<br />
180度角：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 135度角：<br />
1&nbsp;&nbsp; 1&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; -1&nbsp;&nbsp; -1<br />
1&nbsp; -2&nbsp; -1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;-2&nbsp;&nbsp; -1<br />
1&nbsp; -1&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />
3*3时表达式如下:<br />
A1*f(i-1,j-1)&nbsp;&nbsp;&nbsp;&nbsp; A8*f(i,j-1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A7*f(i+1,j-1)<br />
A2*f(i-1,j)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -2*f(i,j)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A6*f(i+1, j)<br />
A3*f(i-1,j+1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A4*f(i,j+1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A5*f(i+1,j+1)<br />
g(i,j)=|-2*f(i,j)+A8*f(i,j-1)+A1*f(i-1,j-1)+A2*f(i-1,j)+A3*f(i-1,j+1)+A4*f(i,j+1)+A5*f(i+1,j+1)+A6*f(i+1,j)+A7*f(i+1,j-1)|<br />
在程序设计中，依次用样板去检测图像，与被检测区域最为相似的样板给出最大值，用该最大值作为算子的输出值。<br />
&nbsp;⊙&nbsp;&nbsp; Robinson算子<br />
Robinson算子是一个模板算子，由八个方向的样板组成，能够在0度，45度，90度，135度，180度，225度角<br />
等八个方向检测边缘。8个3*3边缘模板及方向如下：<br />
90度角:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 45度角:<br />
1&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 1&nbsp; 2<br />
0&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp;0&nbsp;&nbsp; 1<br />
-1 -2 -1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-2&nbsp;&nbsp;-1&nbsp;&nbsp; 0<br />
0度角:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 315度角:<br />
-1&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-2&nbsp;-1&nbsp;&nbsp; 0<br />
-2&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp;0&nbsp;&nbsp; 1<br />
-1&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 1&nbsp;&nbsp; 2<br />
270度角：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 225度角:<br />
-1&nbsp;&nbsp;-2&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; -1&nbsp; -2<br />
0&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; -1<br />
1&nbsp;&nbsp;&nbsp;2&nbsp; &nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; 0<br />
180度角：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 135度角：<br />
1&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; -1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp; 1&nbsp;&nbsp; 0<br />
2&nbsp;&nbsp;0 &nbsp;-2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;0&nbsp; -1<br />
1&nbsp;&nbsp;0&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; -1&nbsp; -2<br />
使用方法与prewitt算子一样。<br />
⊙&nbsp;&nbsp; Kirsch算子<br />
Kirsch算子是一个模板算子，由八个方向的边缘样板组成，能够在0度，45度，90度，135度，180度，225度角<br />
等八个方向检测边缘。8个3*3边缘模板及方向如下：<br />
90度角:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 45度角:<br />
5&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp; 5<br />
-3&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 5<br />
-3 -3 -3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-3&nbsp;&nbsp; -3&nbsp;&nbsp; -3<br />
0度角:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 315度角:<br />
-3&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-3&nbsp;-3&nbsp;&nbsp; -3<br />
-3&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -3&nbsp;&nbsp;0&nbsp;&nbsp; 5<br />
-3&nbsp;&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-3&nbsp;&nbsp;5&nbsp;&nbsp; 5<br />
270度角：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 225度角:<br />
5&nbsp;&nbsp; 5&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp;-3&nbsp; -3<br />
5&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5 &nbsp;&nbsp;0&nbsp;&nbsp; -3<br />
-3&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;5&nbsp;&nbsp; -3<br />
180度角：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 135度角：<br />
5&nbsp;&nbsp;&nbsp;-3&nbsp;&nbsp; -3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp; -3<br />
5&nbsp;&nbsp; 0 &nbsp;-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;0&nbsp; -3<br />
5&nbsp;&nbsp;-3&nbsp;&nbsp;-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-3&nbsp; -3&nbsp; 3<br />
使用方法与prewitt算子一样。<br />
⊙&nbsp;&nbsp; Smoothed算子<br />
Smoothed算子是一个3*3的算子，设<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-1&nbsp; 0&nbsp; 1|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |1&nbsp; 1&nbsp; 1|<br />
Dx = |-1&nbsp; 0&nbsp; 1|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dy = |0&nbsp; 0&nbsp; 0|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-1&nbsp; 0&nbsp; 1|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-1 -1 -1|<br />
则&nbsp; D = sqrt(Dx^2 + Dy^2) 或者 D = |Dx| + |Dy|<br />
或 Dx(i, j) = f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)-f(i-1,j-1)-f(i,j-1)-f(i+1,j-1)<br />
&nbsp;&nbsp; Dy(i,j) = f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)-f(i+1,j-1)-f(i+1,j)-f(i+1,j+1)<br />
<br />
<strong>9)</strong>&nbsp;灰度图像处理<br />
所谓灰度处理是根据单色图像的灰度对输出图像的灰度进行再定义、以改善图像的对比度。单色图像的灰度有256级、128级、64级等，下面均以256级单色图像举例。<br />
我们不妨设源图像的灰度值为f(i,j),处理后的灰度值为g(i,j)<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;逆反处理<br />
与彩色图像的逆反处理一样: g(i,j) = 255 - f(i,j)<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;灰度级切换<br />
灰度级切换的输入、输出灰度值对应关系如下:<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/gray_switch.jpg" border="0" /><br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;增大对比度<br />
</span>输入的灰度值越高，对应的输出灰度值越低。灰度值减少，图像变暗，从而使对比度增加。<br />
<img height="198" alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/increase_contrast.jpg" width="246" border="0" /><br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;减小对比度</span><br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/decrease_contrast.jpg" border="0" /><br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;改善对比度<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/improve_contrast.jpg" border="0" /><br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;增强对比度</span><br />
<img height="270" alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/enhance_contrast.jpg" width="304" border="0" /><br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;局部滤波处理<br />
局部滤波处理是指利用3*3的图像块内的像素的颜色值对当前像素进行设定的一种图像处理技术。<br />
&nbsp;⊙&nbsp;&nbsp; 平均值滤波<br />
与彩色图像平滑处理类似。<br />
g(i,j)=( f(i-1,j-1) + f(i-1,j) + f(i-1,j+1) + f(i,j-1) + f(i,j) + f(i,j+1) + f(i+1,j-1) + f(i+1,j) + f(i+1,j+1) ) / 9<br />
这里要注意的是对于边缘的像素的情况，防止越界。<br />
&nbsp;⊙&nbsp;&nbsp; 最小值滤波<br />
最小值滤波是指在图像中以当前像素f(i,j)为中心切出一个N*M（例如3*3）像素组成的图像块，g(i,j)取图像块中灰度值中的最小值<br />
&nbsp;⊙&nbsp;&nbsp; 最大值滤波<br />
最大值滤波是指在图像中以当前像素f(i,j)为中心切出一个N*M（例如3*3）像素组成的图像块，g(i,j)取图像块中灰度值中的最大值<br />
&nbsp;⊙&nbsp;&nbsp; 中值滤波<br />
中值滤波是指在图像中以当前像素f(i,j)为中心切出一个N*M（例如3*3）像素组成的图像块，g(i,j)取图像块中所有灰度排序后序列的中间值</span></span></span></span></p>
<p><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><strong>10)</strong>&nbsp;灰度图像处理<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;灰度图像的二值化<br />
&nbsp;⊙&nbsp;&nbsp; 灰度图像直方图<br />
对于每个灰度值，求出在图像中具有该灰度值的像素数的图形叫做灰度直方图。。灰度直方图是灰度级的函数，描述图像中具有相同灰度像素的个数。灰度直方图的横坐标是灰度级，纵坐标是该灰度出现的频率（即像素的个数）。直方图的用途主要是给出了一个简单可见的指示，用来判断一幅图像是否合理的利用了全部被允许的灰度级范围。一般一幅数字图像应该利用全部或几乎全部可能的灰度级范围。一般一幅数字图像应该利用全部或几乎全部可能的灰度级，否则增加了量化间隔。一旦被数字化图像的级数小于255，丢失的信息将不能恢复。如果图像具有超出数字量化器所能处理的范围的亮度，则这些灰度级将简单的置为0或255，由此将在直方图的一端或两端产生尖峰。灰度图像直方图具有直方图的一些统计特征参量，包括了灰度最大值，灰度最小值，均值和标准差。<br />
&nbsp;⊙&nbsp;&nbsp; 阙值计算和图像二值化<br />
图像二值化的阙值处理方式为:<br />
g(i,j) = 1;&nbsp;&nbsp; f(i,j)&gt;=t<br />
g(i,j) = 0;&nbsp;&nbsp; f(i,j)&lt;t<br />
通常，用g(i,j)=1表示图像，用g(i,)=0表示背景。确定t的方法叫做阙值选择。<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;灰度图像的二值化算法</span><br />
⊙ 类判别法寻找阙值的步骤：<br />
(1) 计算输入图像的灰度级直方图(用灰度级的概率函数PHS(i)来表示)<br />
(2)&nbsp;计算灰度均值(Ave)&nbsp; Ave = sigma((i - 1)*Phs(i))&nbsp; i: 0-&gt;255<br />
(3) 计算灰度类均值(Aver(k))和类直方图和(W(k))<br />
Aver(k) = sigma((i+1)*Phs(i))&nbsp; i: 0-&gt;k<br />
W(k)&nbsp;= sigma(Phs(i)) i: 1-&gt;k<br />
（4）计算类分离指标<br />
Q(k)={[Ave*W(k)-Aver(k)]^2)}/[W(k)*(1-W(k))]}<br />
(5) 求使Q最大的k&nbsp; 最佳阙值: T = k - 1<br />
⊙ 灰度级切片法<br />
<img height="182" alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/gray_cut.jpg" width="294" border="0" originwidth="327" originheight="226" /><br />
将输入图像的某一灰度级范围内的所有像素全部置为0（黑），其余灰度级的所有像素全部置为255（白），则生成黑白<br />
二值图像。<br />
⊙ 等灰度片二值化<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/samegray_cut.jpg" border="0" /><br />
将输入图像在某两个等宽的灰度级范围内的所有像素全部置为0（黑），其余灰度级的所有像素全部置为255（白），则生成黑白二值图像。<br />
⊙ 线性二值化<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/linear_bin.jpg" border="0" /><br />
将输入图像在某一灰度级内的所有像素全部置为0（黑），其余灰度级的所有像素全部置为原值的1/2，则生成黑白二值图像，并将图像与背景分离。<br />
<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●&nbsp;二值图像处理</span><br />
<font face="Verdana">二值图像处理是指将二值化的图像进行某种修正，使之更适合于图像测量。二值图像处理包括以下操作:<br />
<strong>膨胀</strong>&nbsp; 使粒子变大。对图像进行膨胀处理之后再进行收缩处理，则可以修正图像的凹槽<br />
<strong>收缩</strong>&nbsp; 使粒子变小。对图像进行收缩处理之后再进行膨胀处理，则可以修正图像的凸槽<br />
<strong>清除孤立点</strong> 清除由一个像素构成的对象以及修正由一个像素构成的孔。<br />
<strong>清除粒子</strong>&nbsp; 清除任意面积以下的对象<br />
<strong>清除超大粒子</strong>&nbsp; 清除任意面积以上的对象<br />
<strong>洞穴填充</strong>&nbsp; 填充任意范围</font><br />
⊙ <font face="Verdana">4邻域收缩<br />
<font face="Verdana">4邻域收缩的原理是，在3*3的图像块中，如果当前处理像素f(i,j)为0，则其相邻的像素f(i,j+1),f(i,j-1),f(i-1,j),f(i+1,j)均置255。</font><br />
⊙ <font face="Verdana">8邻域收缩</font><br />
<font face="Verdana">8邻域收缩的原理是，在3*3的图像块中，如果当前处理像素f(i,j)为0，则其相邻的像素f(i,j+1),f(i,j-1),f(i-1,j),f(i+1,j),f(i-1,j-1),f(i+1,j-1),f(i-1,j+1),f(i+1,j+1)均置255。</font><br />
⊙ <font face="Verdana">4邻域膨胀<br />
<font face="Verdana"><font face="Verdana">4邻域膨胀的原理是，在3*3的图像块中，如果当前处理像素f(i,j)为1，则其相邻的像素f(i,j+1),f(i,j-1),f(i-1,j),f(i+1,j)均置1。</font></font><br />
⊙ <font face="Verdana">8邻域膨胀</font><font face="Verdana"><font face="Verdana"><br />
8邻域膨胀的原理是，在3*3的图像块中，如果当前处理像素f(i,j)为1，则其相邻的像素f(i,j+1),f(i,j-1),f(i-1,j),f(i+1,j),f(i-1,j-1),f(i+1,j-1),f(i-1,j+1),f(i+1,j+1)均置1。<br />
</font></font></font>⊙ <font face="Verdana"><font face="Verdana">8邻域清除孤立点</font></font><br />
<font face="Verdana">8邻域清除孤立点的原理是，在3*3的图像块中，如果当前处理像素f(i,j)为1，而其相邻的像素f(i,j+1),f(i,j-1),f(i-1,j),f(i+1,j),f(i-1,j-1),f(i+1,j-1),f(i-1,j+1),f(i+1,j+1)均为0时，当前处理像素f(i,j)为0。</font><br />
⊙ <font face="Verdana"><font face="Verdana">4邻域清除孤立点</font></font><br />
<font face="Verdana">4邻域清除孤立点的原理是，在3*3的图像块中，如果当前处理像素f(i,j)为1，而其相邻的像素f(i,j+1),f(i,j-1),f(i-1,j),f(i+1,j均为0时，当前处理像素f(i,j)为0。</font><br />
<br />
<br />
<br />
</font></span></span></span></span></span></font></p>
 <img src ="http://www.cnblogs.com/drizzlecrj/aggbug/1077494.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41213/" target="_blank">[新闻]3G 版 iPhone、iPhone软件 2.0 版推出：一周过后...</a>]]></description></item><item><title>eGroupWare 协同工作平台的搭建及使用</title><link>http://www.cnblogs.com/drizzlecrj/archive/2008/01/08/1030821.html</link><dc:creator>农夫三拳</dc:creator><author>农夫三拳</author><pubDate>Tue, 08 Jan 2008 11:49:00 GMT</pubDate><guid>http://www.cnblogs.com/drizzlecrj/archive/2008/01/08/1030821.html</guid><wfw:comment>http://www.cnblogs.com/drizzlecrj/comments/1030821.html</wfw:comment><comments>http://www.cnblogs.com/drizzlecrj/archive/2008/01/08/1030821.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/drizzlecrj/comments/commentRss/1030821.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/drizzlecrj/services/trackbacks/1030821.html</trackback:ping><description><![CDATA[<p align="center"><font face="Verdana"><strong><span style="font-family: Georgia"><font style="font-family: " face="Verdana"><strong style="font-size: 14pt; font-family: "><a href="http://www.egroupware.org/"><font face="Verdana"><strong><span style="font-family: Georgia"><font style="font-family: " face="Verdana"><strong style="font-size: 14pt; font-family: "></strong></font></span></strong></font></a><span style="font-size: 12pt"><font face="Verdana"><strong><span style="font-family: Georgia"><font style="font-family: " face="Verdana"><strong style="font-family: "></strong></font></span></strong></font></span>eGroupWare 协同工作平台的搭建及使用</strong></font></span><br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>农夫三拳@seu.iws<br />
&nbsp;&nbsp; </strong></font></p>
<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>最近在IWS里面参与了一个B2B的项目, 师兄建议使用协同工作平台来规范化整个开发过程。于是我在网上一通搜索，找了一些以PHP开发的开源系统工作平台，包括: <a href="http://www.simple-groupware.de/cms/"><strong>Simple Groupware</strong></a>，<strong><a href="http://www.phprojekt.com/"><strong>PHProjekt</strong></a></strong>，<strong><a href="http://gforge.org/"><strong>GForge</strong></a></strong>，<strong><a href="http://www.egroupware.org/"><strong>eGroupWare</strong></a></strong>和<a href="http://www.phpgroupware.org/"><strong>phpGroupWare</strong></a>。试用了这些系统的demo, 从用户体验，本地化程度及功能特点，我最终选择了eGroupWare作为这个项目的协同工作平台。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eGroupware<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">是一个多用户，在以</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">PHP</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">为基础的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">API</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">上的定制集为基础开发的，以</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">WEB</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">为基础的工作件套装。目前可用的模板包括：电子邮件，通讯录，日程表，记事簿（备注，任务，电话），内容管理，论坛，书签，维客等。<br />
</span><br />
&nbsp;&nbsp;&nbsp;&nbsp; 由于本人以前没有接触过PHP相关的技术，所以从搭建eGroupWare到配置花了两个下午的时间，中途被无数个问题折磨。综合考虑，我想下面的部分主要从两个部分谈起，一个是eGroupWare的安装及配置，另外一个是eGroupWare的使用。<br />
<br />
<strong style="font-size: 12pt">eGroupWare的安装及配置</strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在配置eGroupWare之前,我最先查阅的是BugFree的帮助文件，知道了PHP相关应用通常需要Apache+PHP+Mysql。<br />
二话不说，先准备环境:<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;Windows XP Sp2<br />
</strong><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;apache_1.3.39-win32-x86<br />
</strong><strong><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;php-5.2.5-Win32<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;MySql 5.0&nbsp; (MySql-Front V3.2)<br />
</strong><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;eGroupWare-1.4.002</strong><br />
<br />
</font>*这里发生了一件搞笑的事情，我在sourceforge上下载eGroupWare包的时候，我把<font face="Verdana">eGroupWare-gallery-1.4.002 当作<font face="Verdana">eGroupWare-1.4.002了,结果等我配好之后才发现不对<img alt="" src="http://www.cnblogs.com/Emoticons/msn/sad_smile.gif" /><br />
</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我最先安装的是apache(apache的安装只要一直next就可以成功完成),然后解压php进行相关配置。这里的配置在网上可以搜出一大堆文章，其中不乏一些图文版。但是要注意的是在配置的过程中：1.注意自己apache和php的版本，不同的版本配置不太一样 2.决定采用CGI还是嵌入模块的方法进行安装。 其实那么多文章我看了很多，每个都说的不一样。刚开始我一直配置不成功，phpinfo()就是显示不出来。这里推荐给大家的方法是使用PHP自带的帮助，可以在php解压后的install.txt中找到具体步骤。另外我还推荐把php的目录和php下的ext目录加入到系统环境变量中，这样可以少了很多麻烦事，然后加完之后一定要记得重启哦<img alt="" src="http://www.cnblogs.com/Emoticons/msn/regular_smile.gif" />！<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里不得不提的是我犯了一个以前犯过很多次的错误：在我检查配置n次后，始终无法正确查看 test.php文件，浏览器显示为文本文件。殊不知那个文件在隐藏后缀的情况下实际上是text.php.txt <img alt="" src="http://www.cnblogs.com/Emoticons/msn/48_48.gif" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还有一个注意点，在php.ini中加入<strong><font face="Verdana">LoadModule php5_module "C:/php/php5apache.dll"</font></strong>的时候，一定不要把php5apache.dll写成php5apache2.dll或者其他。因为前者是面向apache1.x系列，后者面向2.0的。还有在ini中书写文件路径时,一定要用"/",而不是"\"，后者被理解为转义字符。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面的步骤做完之后就可以拿一个简单的php页面做测试了，如果能够正常显示，配置的就没问题了。如果apache服务有问题或者php仍然无法正常显示，请重新阅读安装说明并查看windows的应用程序日志。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面的工作就是安装eGroupWare了，把下载的包解压到您设定的DocRoot下(默认在<strong>XX:\<font face="Verdana">Program Files\Apache Group\Apache\htdocs</font></strong>)。和eGroupWare Gallery2一样，eGroupWare的安装相当的人性化，只需在浏览器中定位到<font face="Verdana"><a href="http://xxxx/egroupware/setup/"><strong>http://XXXX/egroupware/setup/</strong></a><strong>&nbsp;</strong>就可以进行安装了。STEP by STEP，如果出现error或者warning，只要参照网页上面的出错提示一步步做就没问题了。中间需要安装MySql，这个也只需要一直next就可以了。</font>配置好header.inc.php和admin相关之后基本上eGroupWare的配置就结束了。 注意这些所有的配置过程都可以通过以后登录setup这个页面进行修改的。<br />
<br />
</font></font><span style="font-size: 12pt"><strong>eGroupWare的使用&nbsp;<br />
</strong><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10pt"> </span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">首先让我们看看eGroupWare的主要模块组成！&nbsp; </span></span>
<p><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[felamimail </span>电子邮件</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">一个只支持<span lang="EN-US"> IMAP </span>协议（大部分是<span lang="EN-US"> POP3</span>）的邮件阅读程序，它支持<span lang="EN-US"> Sieve </span>邮件过滤规则语言（<span lang="EN-US"><a title="http://www.faqs.org/rfcs/rfc3028.html" href="http://www.faqs.org/rfcs/rfc3028.html">RFC 3028</a></span>），也能够在<span lang="EN-US"> eGroupWare </span>建立新帐号时，同步在<span lang="EN-US">Cyrus IMAP</span>或是<span lang="EN-US">Postfix</span>等邮件服务器上建立对应的邮件帐号；只是目前对于欧美语系以外邮件的支持还不算完整。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[calendar </span>行事历</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt"><span lang="EN-US">eGroupWare </span>的行事历提供许多弹性，能够在安排行程时检视同样群组的使用者行程，也能够由系统协助查询时间的空档，避免在安排行程时产生冲突。除了一般常见到的重复行程、行程提醒与相关字段外，它还能够与<span lang="EN-US">eGroupWare</span>的其它模块产生连结，并且安排行程的与会人员、需要的资源（例如会议室、投影机等），考虑的相当周到。<span lang="EN-US"> </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">行事历、通讯簿与记事本等模块能够透过<span lang="EN-US"> SyncML </span>协议与计算机、手机和<span lang="EN-US">PDA</span>等设备进行资料同步，行程的资料也可以透过<span lang="EN-US"> iCAL </span>或是<span lang="EN-US"> CSV </span>格式汇入，以及汇出<span lang="EN-US"> iCAL </span>格式资料。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[timesheet </span>时间表</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">时间表也可以称之为工时记录表，主要是配合项目管理模块使用，用来让使用者根据项目中的工作内容提报工时，方便会计部门进行项目成本的估算。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[manual </span>线上说明</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">线上说明是基于<span lang="EN-US"> wiki </span>模块延伸出来的功能，主要是希望在官方网站汇集来自世界各地使用者提供的操作说明，透过这个模块就可以下载官方网站最新版本的资料，只是目前资料是以英语、德语为主。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[resources </span>资源管理</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">许多公司内部经常发生抢资源的情形，像是约了一个客户来公司却发现所有的会议室都在使用中，或是等半天就是借不到那个神奇的投影机。资源管理模块就是为了避 免类似情况而设计，可以让使用者预约包括会议室、投影机、公务车或是各种公用资源，避免因为行程上的冲突造成损失。&#8230;当然，前提是没有人有&#8221;插队&#8221;的特权。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[projectmanager,projects </span>项目管理</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt"><span lang="EN-US">projectmanager</span>是新版的项目管理模块，前一个版本为<span lang="EN-US"> projects </span>，前者与其它模块有较佳的整合，而后者则是兼顾了许多细节；虽然两个模块各有拥护者，但是都来自同一个开发者，而这个开发者未来应该只会维护新版的项目管理模块。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[mydms,filemanager </span>档案管理</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">旧版的档案管理模块<span lang="EN-US"> filemanager </span>只是单纯提供档案上传与下载的管理功能，而<span lang="EN-US"> mydms </span>提供了许多进阶功能，像是版本控制、关联档案、异动通知与权限控管等；<span lang="EN-US">filemanager</span>也能够控制权限，不过仅限于模块本身的增、删、改、查，<span lang="EN-US"> mydms </span>进一步做到控制类别与个别档案的权限，适合对于资料安全诉求较高的组织。<span lang="EN-US"> </span></span></span></p>
<p><span lang="EN-US"><br />
<strong><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><span lang="EN-US"><strong>[fudforum </strong></span><strong>讨论区</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></strong></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt"><span lang="EN-US">FUDforum </span>本身就是国外的一个热门讨论区系统，除了大部分讨论区系统可以看到的功能外，甚至能够透过与新闻群组、通讯论坛等系统整合，让部份从<span lang="EN-US">BBS</span>起家的网 站能够移转或是保留现有系统运作。<span lang="EN-US">eGroupWare</span>所内建的 <span lang="EN-US">FUDforum </span>版本已经没有再更新，不过功能已经能够满足大部分需求。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[tts </span>问题传票系统</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">传票给人的感觉很像会计在使用的，其实这个模块有点类似内部联系单，像是计算机坏了需要人处理、客户留言需要转给业务、或是初一十五拜拜要请人去采买牲礼等都 可以透过这个模块&#8221;交办&#8221;或是&#8221;求救&#8221;；因为这样的需求可能像是<span lang="EN-US">A</span>部门接到<span lang="EN-US">B</span>部门的客户电话，然后将资料转给<span lang="EN-US">B</span>部门的主管，再由<span lang="EN-US">B</span>部门的主管转给适当的业 务处理，信息需要传来传去，所以称之为传票。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[messenger </span>线上传讯</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">这个模块提供个人与个人之间的留言功能， 不受限于时间与地理位置限制，像是<span lang="EN-US">A</span>部门的某甲男心仪<span lang="EN-US">B</span>部门的某乙女，就可以透过这个功能留言给某乙女，请她去吃个饭；公司是否允许这样的行为不清楚、某 乙女会不会把某甲男的简讯传给其它人看也不知道，线上传讯就是这么样的一个工具。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[workflow </span>工作流程</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">工作流程是<span lang="EN-US">eGroupWare</span>中较复杂的模块之一，主要用来进行商业流程的自动化，像是文件、信息或任务在一个流程中的参与者中如何传递、处理与通知，可以定义相当多的自动处理规则；这个模块的前身是<span lang="EN-US"> tikiwiki </span>的<span lang="EN-US"> GalaxiaWorkflow</span>，一个以活动为基础的工作流程系统，需要花些时间理解其中的概念才能够应用。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[wiki </span>协同编辑</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">资讯圈子中的朋友对于<span lang="EN-US"> wiki </span>这个新名词应该不陌生，也有人将它翻译作&#8221;快记&#8221;，大部分的人都将它拿来当作知识管理的工具之一；<span lang="EN-US">eGroupWare</span>内建的<span lang="EN-US"> wiki </span>模块与需要记忆大量特殊语法的<span lang="EN-US">wiki</span>系统不同，使用了所见即所得编辑器处理大部分的内容。</span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[jinn </span>网站管理</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt"><span lang="EN-US">JiNN </span>代表了<span lang="EN-US"> JiNN is Not Nuke </span>的递归缩写，作者藉此传达对于<span lang="EN-US"> Nuke </span>系统的热门相当不以为意；这个模块有点像是进阶的数据库管理工具，能够同时让多个人参与多个网站数据库的管理工作，只是操作方式需要花些时间理解。<span lang="EN-US"> </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">举例来说，在<span lang="EN-US">JiNN</span>中定义了一个网站后，<span lang="EN-US">JiNN</span>会去撷取指定网站的数据库信息，接着可以根据数据库中的资料表定义对象；对象中除了资料表的字段名称与属性外，还能够进一步定义数据域位间的关联以及数据域位输入的方式、限制等。相关操作完成后就可以透过<span lang="EN-US">JiNN</span>对该网站进行资料的增、删、改、查，甚至是制作报表等进阶功能，等于是只要将一个网站的前端处理完成就能够用它来进行管理，功能还不会比自己设计的管理接口逊色。<span lang="EN-US"> </span></span></span></p>
<p><strong><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span lang="EN-US">[phpbrain </span>知识管理</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></strong></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">最简单的知识管理方式就是搜集常见问答，接着将许多相关的文章串连在一起，必要时在以这些问答内容为基础撰写完整的教学，甚至延伸出其它格式的教学内容；<span lang="EN-US"> eGroupWare</span>中的知识管理就是基于这样的概念设计，除了发问、回答、自问自答外，还能够连结内部文章或是外部网站，并且附加档案、评论等，所有的操作也会有详实的纪录保留。<span lang="EN-US"> </span></span></span></p>
<p><span lang="EN-US"><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><span lang="EN-US">[<strong>chatty </strong></span><strong>聊天室</strong><span lang="EN-US"><strong>]</strong> </span></span></span></span></span></p>
<span style="font-size: 12pt"><span style="font-size: 10pt"><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Chatty</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">是一个实时的聊天室，也是修改自一个独立的程序</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">，不过是原作者带着它加入</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">eGroupWare</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">中；透过它可以检视目前有哪些人上线，并且与上线的人实时传递讯息。比较特别的地方是这个模块是以</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体"> AJAX </span></span></span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><span style="font-size: 12pt"><span style="font-size: 10pt">技术设计，因此并不会像部份网络聊天室一样频繁的更新画面（这样子对眼睛很不好&#8230;），对于服务器也不会造成太大的负担。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 当然，对我们的项目而言，并不需要如此多的功能，因此我也只挑选了部分的应用程序进行安装，这要得益于eGroupWare的插件式的应用程序集成接口。要指出的是，尽管eGroupWare很强大，但是有很多地方可能使用起来不太习惯，例如在配置&#8220;新闻管理&#8221;时候，需要先进行权限分配才可以进行添加操作(ACL很强大)；"bug跟踪"里头删除需要在编辑里面将状态改为"deleted"才行等等。另外，eGroupWare的汉化不是很完全。<br />
<br />
下图为系统的一些截图：<br />
<br />
</span></span><span style="font-size: 18pt"><span style="font-size: 12pt; color: #ff9900"><strong>日程表<br />
</strong></span><img height="537" alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/calendar.gif" width="1020" border="0" /><br />
<span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><br />
<span style="font-size: 12pt; color: #ff9900"><strong>通讯录<br />
<img height="537" alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/addressbook.gif" width="1020" border="0" /><br />
</strong></span><br />
<span style="font-size: 12pt; color: #ff9900"><strong>记事簿</strong></span><br />
<img height="537" alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/infolog.gif" width="1020" border="0" /><br />
<br />
<span style="font-size: 12pt; color: #ff9900"><strong>项目管理<br />
</strong></span><img height="537" alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/projectmanager.gif" width="1020" border="0" /><br />
<br />
<span style="color: #ff9900"><strong style="font-size: 12pt">资源<br />
</strong></span><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/resource.gif" border="0" /><br />
<br />
<span style="font-size: 12pt; color: #ff9900"><strong>时间表</strong></span><br />
<img height="537" alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/timesheet.gif" width="1020" border="0" /><br />
<br />
<span style="font-size: 12pt; color: #ff9900"><strong>bug追踪<br />
</strong></span><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/bugtracker.gif" border="0" /><br />
<span style="font-size: 12pt; color: #ff9900"><br />
<strong>网上文件柜<br />
<br />
</strong></span><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/filemanager.gif" border="0" /><br />
<br />
<span style="color: #ff9900"><strong style="font-size: 12pt">新闻管理</strong></span><br />
<br />
<img height="537" alt="" src="http://www.cnblogs.com/images/cnblogs_com/drizzlecrj/newsadmin.gif" width="1020" border="0" /><br />
更多精彩要亲自体验<img alt="" src="http://www.cnblogs.com/Emoticons/QQ/14.gif" /><br />
</span><br />
</span></span><strong>小结<br />
</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp; 整个配置的过程掌握了许多知识也回顾了一些知识，虽然目前的系统能够正常运行，但是我在配置过程中并没有过多的考虑系统的安全问题，例如PHP的目录访问限定，普通用户组的修改删除权限等等。<br />
<br />
</span></span></span></span>
<img src ="http://www.cnblogs.com/drizzlecrj/aggbug/1030821.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41212/" target="_blank">[新闻]360杀毒正式公测</a>]]></description></item><item><title>Dynamic Programming: From novice to advanced[翻译]</title><link>http://www.cnblogs.com/drizzlecrj/archive/2007/10/26/939159.html</link><dc:creator>农夫三拳</dc:creator><author>农夫三拳</author><pubDate>Fri, 26 Oct 2007 13:12:00 GMT</pubDate><guid>http://www.cnblogs.com/drizzlecrj/archive/2007/10/26/939159.html</guid><wfw:comment>http://www.cnblogs.com/drizzlecrj/comments/939159.html</wfw:comment><comments>http://www.cnblogs.com/drizzlecrj/archive/2007/10/26/939159.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/drizzlecrj/comments/commentRss/939159.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/drizzlecrj/services/trackbacks/939159.html</trackback:ping><description><![CDATA[<p><font face="Courier New"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dynamic Programming From novice to advanced&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【原文见： http://www.topcoder.com/tc?module=Static&amp;d1=tutorials&amp;d2=dynProg】<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; By Dumitru<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Topcoder Member<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;翻译：</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 农夫三拳<strong>@seu(drizzlecrj@gmail.com)</strong></font>&nbsp; <br />
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; Dynamic programming (简称DP)可以用来解决一类很重要的问题。解决这类问题将会极大的提高你的能力。我将试着帮助您了解如何使用</font><font face="Courier New">DP来解决问题。这篇文章以例子作为基础，因为空谈理论不太容易理解。</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; 注意:&nbsp; 如果您不太想阅读某节或者已经知道了所要讨论的话题-略过它去读下面的部分。</font><br />
</p>
<h3>Introduction (Beginner)</h3>
<font face="Courier New"><strong>什么是动态规划,它怎样描述?</strong><br />
</font><br />
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;动态规划作为一种算法技巧，通常基于一个递推方程和一个(或者多个)初始状态。一个问题的子问题可以从前面已经知道结果的问题中</font><font face="Courier New">得到。使用DP通常可以得到多项式的时间复杂度，因此比起回溯，暴力等方法，它显得更加快些。<br />
</font><font face="Courier New">&nbsp;&nbsp;&nbsp; 现在我们借助一个例子来了解下DP的基础知识:<br />
</font><font face="Courier New">给定N个硬币,它们的面值是(<strong>V1,V2,...,VN</strong>)，并且提供一个总和为S。现在需要找出一个方案，使得用最少的硬币构成S(我们可以无限次</font><font face="Courier New">使用某种面值的硬币),或者说明根本不可能有一种方案可以组成<strong>S</strong>。<br />
</font><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在让我们开始构造一个DP的解决方案:</font><font face="Courier New"> 首先我们需要找到一个已经使用最优方案的状态，借助它，我们可以得到下一个最优方案的状态。</font></p>
<strong><font face="Courier New">"状态"是什么意思?</font></strong><br />
<br />
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; 它是一个用来描述某个问题的子问题,某种情况的一个方式。例如，一个状态可以是某个硬币总和<strong>i</strong>(<strong>i</strong> &lt;= <strong>S</strong>)。比状态i更小的状态可以是</font><font face="Courier New">任意的硬币总和<strong>j</strong>(<strong>j</strong> &lt; <strong>i</strong>)。为了找到一个状态<strong>i</strong>,我们需要找到所有的小的状态j(<strong>j </strong>&lt; <strong>i</strong>)。找到组成硬币总和i的最少硬币总数之后，我们可以很</font><font face="Courier New">容易的计算下一个状态--<strong>i+1</strong>的最优方案。<br />
</font><br />
<strong><font face="Courier New">怎样找出这些状态?</font></strong><br />
</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非常简单-对于每一个硬币<strong>j</strong>,<strong>Vj&lt;=i</strong>，查询一下构成<strong>i-Vj</strong>硬币总和所需要的最少硬币数目(我们之前已经计算过了)。不妨假设这个数字是<strong>m</strong>,</font><font face="Courier New">如果<strong>m+1</strong>小于所求得硬币总和为<strong>i</strong>的最少硬币数量,我们更新它的状态。为了更好的理解这个问题,我们举例如下: 给定面值为1，3和5的硬币,给定的硬币总和S为11。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 首先我们标记状态0(硬币总和0)所需要的最少硬币数目为0.下面我们计算硬币总和1。首先，我们需要标记出这个状态未找到最优解（赋</font><font face="Courier New">值为无穷大就可以了）。然后我们看到只有面值为1的硬币小于等于当前的总和。通过分析，我们可以看到<strong>1-V1=0</strong>,并且硬币为0的方案已经计算</font><font face="Courier New">好了。因为我们在这个方案基础上加上了1，因此我们得到了总和为1的一个方案，所需硬币个数为1。对于这个硬币总和，这是唯一能够找到的</font><font face="Courier New">方案。我们记下状态。然后我们处理下一个状态-总和为2.我们发现少于这个总和的只有第一个硬币1。对于硬币总和(2-1)=1的最优解是硬币1.</font><font face="Courier New">硬币1加上第一个硬币将得到硬币总和为2，并且可以用2枚硬币得到硬币总和2。这对于硬币总和2来说是最优的也是仅有的方案。下面我们继续</font><font face="Courier New">处理硬币总和3。由于我们已经分析了两种硬币总和，并且第一个硬币和第二个硬币的面值为1和3。我们先看第一个，不难发现，可以通过2(3</font><font face="Courier New">-1)构建出总和为3的一种方案。对于硬币总和为2来说我们找到的最优解法需要2枚硬币，因此硬币总和3的新的方案需要3枚硬。现在让我们</font><font face="Courier New">来看第二个硬币。我们可以从0的基础上假上3得到硬币总和3.我们知道硬币总和为0的情况需要0枚硬币。因此硬币总和3仅需要一枚硬币即可-3</font><font face="Courier New">。我们看到这个方案要比前面一个方案所需要的硬币数量上，因此我们更新它，并且标记它仅需要一枚硬币就能得到。对于硬币总和4，我们进</font><font face="Courier New">行同样的处理，得到的结果是2个-1+3。如此下去。</font><br />
<strong><strong><font face="Courier New"><br />
伪代码:</font></strong></strong></p>
<pre class="code">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Set&nbsp;Min[i]&nbsp;equal&nbsp;to&nbsp;Infinity&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;all&nbsp;of&nbsp;i<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />Min[</span><span style="color: #000000">0</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />For&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;to&nbsp;S<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />For&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;to&nbsp;N&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;If&nbsp;(Vj</span><span style="color: #000000">&lt;=</span><span style="color: #000000">i&nbsp;AND&nbsp;Min[i</span><span style="color: #000000">-</span><span style="color: #000000">Vj]</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">&lt;</span><span style="color: #000000">Min[i])<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />Then&nbsp;Min[i]</span><span style="color: #000000">=</span><span style="color: #000000">Min[i</span><span style="color: #000000">-</span><span style="color: #000000">Vj]</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />Output&nbsp;Min[S]<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span></div>
</pre>
<strong><font face="Courier New">下面是一些硬币总和的方案数:</font></strong> <br />
<br />
<table class="formFrame" cellspacing="0" cellpadding="5" width="400" align="center">
    <tbody>
        <tr>
            <td class="sidebarTitle" noWrap>Sum</td>
            <td class="sidebarTitle" noWrap>Min. nr. of coins</td>
            <td class="sidebarTitle" noWrap>Coin value added to a smaller sum to<br />
            obtain this sum (it is displayed in brackets)</td>
        </tr>
        <tr>
            <td class="sidebarText">0</td>
            <td class="sidebarText">0</td>
            <td class="sidebarText">-</td>
        </tr>
        <tr>
            <td class="sidebarText">1</td>
            <td class="sidebarText">1</td>
            <td class="sidebarText">1 (0)</td>
        </tr>
        <tr>
            <td class="sidebarText">2</td>
            <td class="sidebarText">2</td>
            <td class="sidebarText">1 (1)</td>
        </tr>
        <tr>
            <td class="sidebarText">3</td>
            <td class="sidebarText">1</td>
            <td class="sidebarText">3 (0)</td>
        </tr>
        <tr>
            <td class="sidebarText">4</td>
            <td class="sidebarText">2</td>
            <td class="sidebarText">1 (3)</td>
        </tr>
        <tr>
            <td class="sidebarText">5</td>
            <td class="sidebarText">1</td>
            <td class="sidebarText">5 (0)</td>
        </tr>
        <tr>
            <td class="sidebarText">6</td>
            <td class="sidebarText">2</td>
            <td class="sidebarText">3 (3)</td>
        </tr>
        <tr>
            <td class="sidebarText">7</td>
            <td class="sidebarText">3</td>
            <td class="sidebarText">1 (6)</td>
        </tr>
        <tr>
            <td class="sidebarText">8</td>
            <td class="sidebarText">2</td>
            <td class="sidebarText">3 (5)</td>
        </tr>
        <tr>
            <td class="sidebarText">9</td>
            <td class="sidebarText">3</td>
            <td class="sidebarText">1 (8)</td>
        </tr>
        <tr>
            <td class="sidebarText">10</td>
            <td class="sidebarText">2</td>
            <td class="sidebarText">5 (5)</td>
        </tr>
        <tr>
            <td class="sidebarText">11</td>
            <td class="sidebarText">3</td>
            <td class="sidebarText">1 (10)</td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; 结果我们就得到了一个组成硬币总和11需要3枚硬币的方案。</font><font face="Courier New">此外，如果如果我们记录下从前一个状态得到当前状态所需要的硬币，我们可以找出组成该硬币总和所需要的所有硬币。例如:要组成硬币总和</font><font face="Courier New">11，我们可以通过面值为1的硬币加上面值为10的硬币。为了得到10，我们需要得到5，而5需要从0，因此我们找到了所使用到的硬币:1,5和5。</font></p>
<p><font face="Courier New">&nbsp;&nbsp; 了解了<strong>DP</strong>的一些基本的套路，现在让我们从一个不同的角度来看待这个问题。无论何时对于一个硬币总和我们发现了一个更优的解，我们都</font><font face="Courier New">需要去更新它。在这种情况下状态并不是连续计算的。继续考虑上面的那个例子。已知了硬币总和为0需要0枚硬币。现在我们试图在所有已经</font><font face="Courier New">知道的结果中加上第一个，硬币（面值为1）。如果硬币总和t比起它的前一个状态需要的硬币数量更少，我们将更新它。对于第二个硬币，第</font><font face="Courier New">三个硬币，和剩下的都是这样处理。例如，我们首先在硬币总和0上加上1得到硬币总和1.因为我们还未找到一个方法组成1-因此这是目前找到的最佳方案，我们标记<strong>S[1]=1</strong>。通过在硬币总和1上加上1，我们得到了硬币总和2，我们标</font><font face="Courier New">记<strong>S[2]=2</strong>。然后对于第一个硬币依次下去。当第一个硬币处理完之后，取出第二个硬币（面值为3），并在所有已经找出的硬币总和上加上3。</font><font face="Courier New">在0上加3我们得到了硬币总和3需要一枚硬币，到目前为止，S[3]是等于3的，而现在新的方案要比这个先前的方案要更加的好，我们更新它并</font><font face="Courier New">将它标记为<strong>S[3]=1</strong>。在硬币总和1上加上相同的硬币，我们得到了可以用2枚硬币得到硬币总和4。之前我们发现的硬币总和4需要4枚硬币组成；</font><font face="Courier New">现在找到了一个更好的方案，我们更新<strong>S[4]</strong>为2。对于下面的硬币总和，我们照着上面这样一次下面-一旦一个更优的方案找到，结果将会被更新。</font></p>
<br />
<h3>Elementary</h3>
<p><font face="Courier New"><strong><em>&nbsp;&nbsp; </em></strong>之前我们已经讨论过了非常简单的例子。现在让我们看看在一些复杂问题中如何找出一种从一个状态转移到另外一个状态的方法。在此之</font><font face="Courier New">前，我们将会介绍一个新的词汇--转移关系，它使得一个较低的一个状态能和较高的状态联系在一起。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 让我们看看它是如何工作的：</font></p>
<p><font face="Courier New">给定N个数字序列-<strong>A[1],A[2],...,A[N]</strong>。找出最长不下降子序列。</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; 正如上面所说，我们需要找出怎样定义代表子问题的一个"状态"，并找出一个解决方案。注意在大多数情况下，状态只依赖与较低的状态</font><font face="Courier New">而独立与较高的状态。</font><font face="Courier New">我们定义状态i为最后数字为A[i]的最长不下降子序列。这个状态只保存这个序列的长度。注意对i&lt;j而言，状态i和j是独立的，也就是说</font><font face="Courier New">在计算j状态的时候，是不会影响状态i的。现在让我们看看这些状态怎样互相联系的。在找出所有小于i的状态解决方案之后，我们会找状态i</font><font face="Courier New">，首先我们初始化它的结果为1，也就是仅仅包含自身。现在对每个j&lt;i，我们看从它是否能够到达状态i。只有当A[j]&lt;=A[i]以后才可以,才能</font><font face="Courier New">保证整个序列不下降。 因此如果<strong>S[j]</strong>(为状态j找出的方案)+1(A[i]被增加到以A[j]作为结尾的序列中)要比状态i已经找到的方案要更加好的话</font><font face="Courier New">(也就是 <strong>S[j] + 1&gt;S[i]</strong>)，我们使得<strong>S[i]=S[j]+1</strong>。这样我们可以不断的找出每一个状态i的最优方案，知道最后一个状态N。</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; 现在我们看看对于一个随机生成的序列: 5,3,4,8,6,7 整个过程如何进行:</font> <br />
<br />
<br />
<table class="formFrame" cellspacing="0" cellpadding="5" width="400" align="center">
    <tbody>
        <tr>
            <td class="sidebarTitle" noWrap width="100%">I</td>
            <td class="sidebarTitle" noWrap>The length of the longest<br />
            non-decreasing sequence<br />
            of first i numbers</td>
            <td class="sidebarTitle" noWrap>The last sequence i from<br />
            which we "arrived"<br />
            to this one</td>
        </tr>
        <tr>
            <td class="sidebarText">1</td>
            <td class="sidebarText">1</td>
            <td class="sidebarText">1 (first number itself)</td>
        </tr>
        <tr>
            <td class="sidebarText">2</td>
            <td class="sidebarText">1</td>
            <td class="sidebarText">2 (second number itself)</td>
        </tr>
        <tr>
            <td class="sidebarText">3</td>
            <td class="sidebarText">2</td>
            <td class="sidebarText">2</td>
        </tr>
        <tr>
            <td class="sidebarText">4</td>
            <td class="sidebarText">3</td>
            <td class="sidebarText">3</td>
        </tr>
        <tr>
            <td class="sidebarText">5</td>
            <td class="sidebarText">3</td>
            <td class="sidebarText">3</td>
        </tr>
        <tr>
            <td class="sidebarText">6</td>
            <td class="sidebarText">4</td>
            <td class="sidebarText">4</td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><font face="Courier New"><strong>练习题:<br />
</strong><em>&nbsp;&nbsp;&nbsp; </em>给定一个有N(1&lt;N&lt;=1000)个顶点和正权重的无向图。找出从顶点1到顶点N的最短路径，或者说明这样的路径不存在。</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; 提示:在每一步中，在所有没有被检查的顶点中，如果找出从1到该点的一个最短路径，找出具有最短路径的一条。</font></p>
<p><font face="Courier New">试着解决TopCoder比赛中的下面一些问题:</font></p>
<ul>
    <li><a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4493&amp;pm=1259">ZigZag</a> - 2003 TCCC Semifinals 3
    <li><a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=5009&amp;pm=2402">BadNeighbors</a> - 2004 TCCC Round 4
    <li><a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=5006&amp;pm=1918">FlowerGarden</a> - 2004 TCCC Round 1 </li>
</ul>
<h3>Intermediate</h3>
<p><font face="Courier New"><em><strong>&nbsp;&nbsp;&nbsp; </strong></em>现在让我们看看如何解决2维DP问题。<br />
问题:<br />
&nbsp;&nbsp; 一个拥有N*M个单元的格子，每一个里面都有着一定数量的苹果，数量已经给定。现在你位于左上角。每一步你可以向下走或者向右走。问</font><font face="Courier New">你能够收集到最多多少个苹果。</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; 这个问题可以向其他DP问题一样来解决；几乎没有差别。</font><font face="Courier New">首先我们需要找出一个状态。首先我们需要注意到到某个单元里最多有两种方法-要么从它的左边过来(如果当前格子不是在第一列的话)，</font><font face="Courier New">要么从上方过来(如果它不是在最上面的行的话)。为了找到该单元的最优方案，我们首先需要找到到达它的单元的最优方案。</font><font face="Courier New">从上面的叙述中，我们可以很容易的得到转移关系:<br />
<strong>S[i][j]=A[i][j]+max(S[i-1][j],if i&gt;0; S[i][j-1],if j&gt;0)</strong> (这里的i代表行，j代表列。左上角的坐标为{0,0}；<strong>A[i][j]</strong>为i,j单元格中的</font><font face="Courier New">苹果数量)。</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;<strong> S[i][j]</strong>需要在每行中从左到右计算，并且从上到下计算每一行，或者从上到下计算每一列然后从左到右处理每一列。</font><br />
<br />
<font face="Courier New">伪代码:</font></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"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">For&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;to&nbsp;N&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;For&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;to&nbsp;M&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;S[i][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[i][j]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max(S[i][j</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;j</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;&nbsp;S[i</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">][j],&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />Output&nbsp;S[n</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">][m</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">]</span></div>
<font face="Courier New">下面是TopCoder比赛中的一些题目，作为练习之用：</font>
<ul>
    <li><a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4709&amp;pm=1889">AvoidRoads</a> - 2003 TCO Semifinals 4
    <li><a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4482&amp;pm=1592">ChessMetric</a> - 2003 TCCC Round 4 </li>
</ul>
<h3>Upper-Intermediate</h3>
<p><font face="Courier New">这节将讨论如何处理带有约束条件的DP问题。</font></p>
<p><font face="Courier New">下面是一个例子：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给定一个拥有N个顶点和正权重的无向图G。你在出发前拥有M钱，为了通过顶点i，你需要付S[i]钱。如果你没有足够的钱-你不能通过</font><font face="Courier New">顶点i。现在要求在上面的条件下找出从顶点1到顶点N的最短路径；或者说明这样的路径不存在。如果存在多条相同长度的路径，输出最便宜的</font><font face="Courier New">一条。条件: 1&lt;N&lt;=100;0&lt;=M&lt;=100；对每个顶点i，0&lt;=S[i]&lt;=100。正如我们所看到的，这和经典的<strong>Dijkstra</strong>问题(找出两个顶点间的最短距离)不同的是，这里有一个</font><font face="Courier New">额外的提交。在经典Dijkstra问题中我们用到了一个一维数组Min[i]，用来标记已经找到的从起点到i的最短距离。尽管如此，在这个问题中，</font><font face="Courier New">我们应该也要保存我们拥有钱的信息。因此将数组扩展到M[i][j]来代表从起点到顶点i的最短距离剩下j钱，也是合情合理的。这样问题就被规</font><font face="Courier New">约到普通的寻找路径的算法了。在每一步中我们找到没有标记的状态(i,j)，然后我们将其标记为已访问过(后面将不再使用)，对每个邻居结点</font><font face="Courier New">，我们查看是否到它的最短距离可以更新。这个方案将会由记录最小值的<strong>Min[N-1][j]</strong>来表示(状态中具有相同值的最大的j，也就是最短路径的</font><font face="Courier New">距离一样)。</font></p>
<p><font face="Courier New">伪代码:</font></p>
<pre class="code">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Set&nbsp;states(i,j)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;unvisited&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;all&nbsp;(i,j)<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />Set&nbsp;Min[i][j]&nbsp;to&nbsp;Infinity&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;all&nbsp;(i,j)<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />Min[</span><span style="color: #000000">0</span><span style="color: #000000">][M]</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />While(TRUE)<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />Among&nbsp;all&nbsp;unvisited&nbsp;states(i,j)&nbsp;find&nbsp;the&nbsp;one&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;which&nbsp;Min[i][j]<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;the&nbsp;smallest.&nbsp;Let&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;state&nbsp;found&nbsp;be&nbsp;(k,l).<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />If&nbsp;there&nbsp;wasn</span><span style="color: #000000">'</span><span style="color: #000000">t&nbsp;found&nbsp;any&nbsp;state&nbsp;(k,l)&nbsp;for&nbsp;which&nbsp;Min[k][l]&nbsp;is</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">less&nbsp;than&nbsp;Infinity&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;exit&nbsp;While&nbsp;loop.<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />Mark&nbsp;state(k,l)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;visited<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />For&nbsp;All&nbsp;Neighbors&nbsp;p&nbsp;of&nbsp;Vertex&nbsp;k.<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;If&nbsp;(l</span><span style="color: #000000">-</span><span style="color: #000000">S[p]</span><span style="color: #000000">&gt;=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;AND<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Min[p][l</span><span style="color: #000000">-</span><span style="color: #000000">S[p]]</span><span style="color: #000000">&gt;</span><span style="color: #000000">Min[k][l]</span><span style="color: #000000">+</span><span style="color: #000000">Dist[k][p])<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Then&nbsp;Min[p][l</span><span style="color: #000000">-</span><span style="color: #000000">S[p]]</span><span style="color: #000000">=</span><span style="color: #000000">Min[k][l]</span><span style="color: #000000">+</span><span style="color: #000000">Dist[k][p]<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;i.e.<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />If&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;state(i,j)&nbsp;there&nbsp;are&nbsp;enough&nbsp;money&nbsp;left&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />going&nbsp;to&nbsp;vertex&nbsp;p&nbsp;(l</span><span style="color: #000000">-</span><span style="color: #000000">S[p]&nbsp;represents&nbsp;the&nbsp;money&nbsp;that<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />will&nbsp;remain&nbsp;after&nbsp;passing&nbsp;to&nbsp;vertex&nbsp;p),&nbsp;and&nbsp;the<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />shortest&nbsp;path&nbsp;found&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;state(p,l</span><span style="color: #000000">-</span><span style="color: #000000">S[p])&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;bigger<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />than&nbsp;[the&nbsp;shortest&nbsp;path&nbsp;found&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />state(k,l)]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;[distance&nbsp;from&nbsp;vertex&nbsp;k&nbsp;to&nbsp;vertex&nbsp;p)],<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />then&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;the&nbsp;shortest&nbsp;path&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;state(i,j)&nbsp;to&nbsp;be&nbsp;equal<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />to&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;sum.<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />End&nbsp;For<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />End&nbsp;While<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />Find&nbsp;the&nbsp;smallest&nbsp;number&nbsp;among&nbsp;Min[N</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">][j]&nbsp;(</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;all&nbsp;j,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&lt;=</span><span style="color: #000000">j</span><span style="color: #000000">&lt;=</span><span style="color: #000000">M);<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;there&nbsp;are&nbsp;more&nbsp;than&nbsp;one&nbsp;such&nbsp;states,&nbsp;then&nbsp;take&nbsp;the&nbsp;one&nbsp;with&nbsp;greater<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />j.&nbsp;If&nbsp;there&nbsp;are&nbsp;no&nbsp;states(N</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">,j)&nbsp;with&nbsp;value&nbsp;less&nbsp;than&nbsp;Infinity&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;then<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />such&nbsp;a&nbsp;path&nbsp;doesn</span><span style="color: #000000">'</span><span style="color: #000000">t&nbsp;exist.</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span></div>
</pre>
<font face="Courier New"><br />
下面是一些用来练习的TC中的题目：</font>
<ul>
    <li><a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4705&amp;pm=1166">Jewelry</a> - 2003 TCO Online Round 4
    <li><a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4555&amp;pm=1215">StripePainter</a> - SRM 150 Div 1
    <li><a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=5072&amp;pm=2829">QuickSums</a> - SRM 197 Div 2
    <li><a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4630&amp;pm=1861">ShortPalindromes</a> - SRM 165 Div 2 </li>
</ul>
<h3>Advanced</h3>
<font face="Courier New"><em>&nbsp;</em>下面的问题需要非常好的观察才能够将他们规约到动态规划的问题。<br />
</font><br />
<strong>Problem <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=5854&amp;pm=2940">StarAdventure</a> - SRM 208 Div 1:</strong> <br />
<br />
<p><font face="Courier New"><strong><em>&nbsp;</em></strong>给定一个拥有M行，N列的矩阵(N*M)。在每一个格子中有一些苹果，你从矩阵的左上角出发，可以向下或者向右走。你需要到达右下角。然</font><font face="Courier New">后你需要通过每一步向上走或者向左走回到左上角。回到左上角之后，你需要回头再到右下角。找出你能够收集的最大苹果数。当你经过一个格子的时候-你会收集到其中所有的苹果。条件: 1 &lt; N,M &lt;= 50;每个格子里面的苹果数在0到1000之间(包括0和1000)。</font></p>
<br />
<p><font face="Courier New">&nbsp;首先我们会注意到这个问题和经典的问题（在这篇文章的第三节提到的）有点相似，在那个问题中我们只需要从左上走到右下，然后收集</font><font face="Courier New">尽量多的苹果。如果能将这里的问题规约到那个问题就太好了。<br />
再仔细的读题-我们应该怎样修改才能够使得它能够使用DP来解决呢? 首先我们观察到我们可以将第二条路径(从右下角走到左上角)看作从左上</font><font face="Courier New">走到右下的一条路径。这个没有什么区别，因为一条从底到上的路线，可以看作相反方向从上到底的路线。通过这种方法，我们得到了三条从</font><font face="Courier New">上到下的路径。这无疑减少了问题的难度。当两条路径相交时(如下图),我们将称呼这三条路径叫做 左，中，右。</font></p>
<br />
<center><img alt="" src="http://www.topcoder.com/i/education/dynProg_1.gif" border="0" /> </center><br />
<br />
我们可以将他们考虑成下面<font face="Courier New">的图片，而不影响结果:</font><br />
<br />
<center><img alt="" src="http://www.topcoder.com/i/education/dynProg_2.gif" border="0" /> </center><br />
<br />
<p><font face="Courier New">这样我们得到了三条路径，我们将他们考虑为左，中和右。此外，我们还会看到一个最优的方案是不会有相交的地方的(出了左上角和右下角)</font><font face="Courier New">。因此对于每一行y(除了第一行和最后一行),他们三条线的x坐标分别为<strong>x1[y],x2[y]</strong>和<strong>x3[y]</strong>: <strong>x1[y]&lt;x2[y]&lt;x3[y]</strong>。 在这步做完之后，DP的方</font><font face="Courier New">案就变得非常明显了。考虑第y行。假定我们已经找到了能够获得最大苹果的路径, <strong>x1[y-1],x2[y-1]</strong>和<strong>x3[y-1]</strong>。从他们基础之上，我们找到对</font><font face="Courier New">于第y行的最优策略。现在我们已经找到了由一行转移到另一行的唯一的方法。设<strong>Max[i][j][k]</strong>代表在y-1行，并且三条路径的终点在i,j和k能</font><font face="Courier New">得到的最大苹果数。 对于下一行y行，对于每一个<strong>M[i][j][k]</strong>加上在单元格(y,i),(y,j)和(y,k)中的苹果数。接着我们继续向下走。在我们移</font><font face="Courier New">动之后，我们需要考虑到路径可能向右移动了。为了避免出现路径相交的情况。我们首先应该考虑左边路径的右边，然后考虑中间的路径，然</font><font face="Courier New">后右边的路径。为了更好的理解向右移动，取出每一个可能的对，k(j&lt;k)，对于每一个i(i&lt;j)考虑从位置(i-1,j,k)移动到位置(i,j,k)。左边</font><font face="Courier New">的路径完成之后，处理中间的，做法类似，最后处理最右边的。<br />
</font></p>
<font face="Courier New"><br />
TC中的练习题</font>
<ul>
    <li><a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4710&amp;pm=1996">MiniPaint</a> - SRM 178 Div 1 </li>
</ul>
<p><font face="Courier New"><strong>附加的注意点:</strong><br />
&nbsp;&nbsp;&nbsp; 当我们阅读完问题之后并着手解决它时，首先看看它的约束条件。如果一个多项式级的算法，那么一个DP的方案是可行的。在这种情况下</font><font face="Courier New">，试着去找出如果存在一个状态(子问题)，能否推出下一个状态(子问题)。如果发现了之后，应当考虑如何从一个状态转移到另外一个状态。</font><font face="Courier New">如果它看起来是DP问题，但是你找不出状态，那么试图将其转换为另外一个问题(就像上面第5节的问题一样)。</font></p>
<p><font face="Courier New">文中提到的问题:</font></p>
TCCC '03 Semifinals 3 Div I Easy - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4493&amp;pm=1259">ZigZag</a><br />
TCCC '04 Round 4 Div I Easy - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=5009&amp;pm=2402">BadNeighbors</a><br />
TCCC '04 Round 1 Div I Med - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=5006&amp;pm=1918">FlowerGarden</a><br />
TCO '03 Semifinals 4 Div I Easy - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4709&amp;pm=1889">AvoidRoads</a><br />
TCCC '03 Round 4 Div I Easy - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4482&amp;pm=1592">ChessMetric</a><br />
TCO '03 Round 4 Div I Med - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4705&amp;pm=1166">Jewelry</a><br />
SRM 150 Div I Med - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4555&amp;pm=1215">StripePainter</a><br />
SRM 197 Div II Hard - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=5072&amp;pm=2829">QuickSums</a><br />
SRM 165 Div II Hard - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4630&amp;pm=1861">ShortPalindromes</a><br />
SRM 208 Div I Hard - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=5854&amp;pm=2940">StarAdventure</a><br />
SRM 178 Div I Hard - <a href="http://www.topcoder.com/tc?module=ProblemDetail&amp;rd=4710&amp;pm=1996">MiniPaint</a><br />
<strong><em>&nbsp;</em></strong> 
 <img src ="http://www.cnblogs.com/drizzlecrj/aggbug/939159.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41211/" target="_blank">[新闻]微软CFO：将投入更多资金发展搜索业务</a>]]></description></item><item><title>Range Minimum Query and Lowest Common Ancestor[翻译]</title><link>http://www.cnblogs.com/drizzlecrj/archive/2007/10/23/933472.html</link><dc:creator>农夫三拳</dc:creator><author>农夫三拳</author><pubDate>Tue, 23 Oct 2007 01:38:00 GMT</pubDate><guid>http://www.cnblogs.com/drizzlecrj/archive/2007/10/23/933472.html</guid><wfw:comment>http://www.cnblogs.com/drizzlecrj/comments/933472.html</wfw:comment><comments>http://www.cnblogs.com/drizzlecrj/archive/2007/10/23/933472.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/drizzlecrj/comments/commentRss/933472.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/drizzlecrj/services/trackbacks/933472.html</trackback:ping><description><![CDATA[摘要:  Range Minimum Query and Lowest Common Ancestor【原文见 http://www.topcoder.com/tc?module=Static&amp;d1=tutorials&amp;d2=lowestCommonAncestor】作者： By danielp Topcoder Member 翻译： 农夫三拳@seuIntroductionNotatio&nbsp;&nbsp;<a href='http://www.cnblogs.com/drizzlecrj/archive/2007/10/23/933472.html'>阅读全文</a><img src ="http://www.cnblogs.com/drizzlecrj/aggbug/933472.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41210/" target="_blank">[新闻]微软发布Fiji 取名Media Center TV Pack 2008</a>]]></description></item><item><title>称球问题</title><link>http://www.cnblogs.com/drizzlecrj/archive/2007/10/21/931837.html</link><dc:creator>农夫三拳</dc:creator><author>农夫三拳</author><pubDate>Sun, 21 Oct 2007 03:32:00 GMT</pubDate><guid>http://www.cnblogs.com/drizzlecrj/archive/2007/10/21/931837.html</guid><wfw:comment>http://www.cnblogs.com/drizzlecrj/comments/931837.html</wfw:comment><comments>http://www.cnblogs.com/drizzlecrj/archive/2007/10/21/931837.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/drizzlecrj/comments/commentRss/931837.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/drizzlecrj/services/trackbacks/931837.html</trackback:ping><description><![CDATA[<P>称球问题的一个经典形式如下:</P>
<P>"有十二个外表相同的球，其中有一个坏球，它的重量和其他十一个有轻微的（但是可以测量出来的）差别。现在有一架没有砝码的很灵敏的天平，问如何称三次就能保证找出那个坏球，并知道它比标准重还是轻。"</P>
<P>这个问题比较好的叙述和解答可以参加《<A class="" href="http://www.oursci.org/magazine/200109/010918-1.htm" target=_blank mce_href="http://www.oursci.org/magazine/200109/010918-1.htm">称球问题--经典智力题推而广之三</A>》和 WC2003 何林的论文《一类称球问题的解法》（用到了三分及判定树的思想）。</P>
<P>详细的过程我就不写了，把加个结论再叙述一下：</P>
<P>有一架天平，有n(n &gt;= 3)个球，其中一个是次品。(注：下面用符号{}表示取上整,[]表示取下整)</P>
<P>结论1 次品的重量比其他重（轻），称{log3(n)}次就能找出那个次品</P>
<P>结论2&nbsp; 次品的重量不知。有一个标准球。称{log3(2*n)}次可以找出那个次品，并且知道次品的轻重。</P>
<P>结论3&nbsp; 次品的重量不知。称{log3(2*n+2)}次就能找到次品，并且知道次品的轻重。</P>
<P>结论4&nbsp; 次品的重量不知。有一个标准球。称{log3(2*n-1)}次可以找出次品。</P>
<P>如果m&gt;=0,n&gt;=0且m，n不同时为0.在编号从1到m+n的m+n个球中，我们知道1到m号球要么是标准球，要么比标准球重，而m+1到m+n号球要么是标准球，要么比标准球轻，此外我们还知道有一个坏球(但不知轻重)</P>
<P>结论5&nbsp; 要保证m+n个球中找出坏球并知道其轻重，至少需要称{log3(m+n)}次。 如果m和n不同时为1，那么称{log3(m+n)}次就足够了。如果m=n=1，并且另有一标准球，那么称{log3(m+n)}={log3(1+1)} = 1次就足够了。<FONT color=#ff0000>注:如果m=n=1并且没有标准球，那么永远也称不出坏球。</FONT></P>
<P>现有n个小球，其中有一个坏球不知道比标准球轻还是重，令H={log3(2*n)}。要保证N个球中找出坏球并知道轻重，至少需要称H次。假设n不等于2，则有</P>
<P>结论6 如果N&lt;(3^H - 1)/2，那么称H次就足够了;N=(3^H - 1)/2，那么称H次足以找到坏球，但不足以知道坏球比标准球是重还是轻;如果N=(3^H - 1)/2，而且还另有一个标准球，那么称H次足以保证找到坏球和知道坏球比标准球轻还是重。特别地，当N=2时，如果还另有一个标准球，称H={log3(2*2)}=2次足以保证找到坏球和知道坏球比标准球轻还是重。</P>
<P>下面是几个和“称球问题”相关的题目:</P>
<P>1. <STRONG><A class="" href="http://acm.hit.edu.cn/ojs/show.php?Proid=2519&amp;Contestid=0" target=_blank mce_href="http://acm.hit.edu.cn/ojs/show.php?Proid=2519&amp;Contestid=0">hit 2519 Fake coin</A></STRONG></P>
<P>上述结论1</P>
<P>2. <STRONG><A class="" href="http://acm.ustc.edu.cn/makeproblem.php?probID=624" target=_blank mce_href="http://acm.ustc.edu.cn/makeproblem.php?probID=624">ustc 624 称球问题</A></STRONG></P>
<P>这个题目是给定可以称的次数，问最多可以在多少个球中可以称出坏球。由于题目并没有要求知道坏球的轻重，因此我们可以使用结论6，即N=(3^H - 1)/2,但是这里有一个/2，无法满足题目中的同余性质，我们当然可以使用大数运算，不过此题还有更加好的方法。我们设f(h)=(3^h - 1)/2,则f(h+1)=(3^(h+1)-1)/2，不难得到f(h+1)=f(h)+3^h，那这样的话就可以使用同余性质了。但是h的范围在10^9，直接线性的循环肯定挂了。其实不难想象这个数列有循环节，写个程序就可以找到了，循环节是464。</P>
<P>3. <STRONG><A class="" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1029" target=_blank mce_href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1029  ">pku 1029 False coin</A></STRONG>&nbsp;</P>
<P mce_keep="true">这个题目是给定了n个球，其中有一个坏球，重量未知，然后给出K组称量结果，问最后的坏球是哪一个，这个题目直接做比较烦琐，我直接枚举第i个球是坏球，并且是轻还是重来做，最后再判断的，时间复杂度O(n * k * 2)</P><img src ="http://www.cnblogs.com/drizzlecrj/aggbug/931837.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41209/" target="_blank">[新闻]Firefox发布升级版本3.0.1 修复数个安全问题</a>]]></description></item></channel></rss>