Web开发 2009-12-23 09:24:12 518次浏览 | 104条评论

1.mysql中的timestamp字段,可以使用字符串插入和修改,字符串的格式为"年-月-日 时:分:秒"。要注意各个部分的取值范围,今天sb了,日默认设置为0,update死活报错。

2.php中有2个函数strpos和strstr用来查找某个字符串是否包含在另一个字符串。strpos成功时返回的是所在位置,不成功时false。对于特殊情况,"hello"与"hello"返回的是0。我们就不知道到底包含不包含了。建议使用strstr。

3.最小高度问题。利用了ie6 !important bug 和min-height不认识的bug及ie6当高度为固定内容超过时,自动撑开的特性。总的来说都是为了ie6才用这种方法的

CODE
#marjin {
   background:#ccc;
   min-height:100px;
   height:auto !important;
   height:100px;
   overflow:visible;
}

4.php开启rewrite模块,修改http.conf文件

CODE
LoadModule rewrite_module modules/mod_rewrite.so

<Directory />
   Options FollowSymLinks
   AllowOverride All
</Directory>

<Directory "/var/www/html">
   Options Indexes FollowSymLinks
   AllowOverride All
   Order allow,deny
   Allow from all
切记要把AllowOverride设置为All

程序设计 2009-12-21 07:02:20 592次浏览 | 没有评论

我们先来看看括号匹配问题:POJ2955--Brackets。通过下面的规则来定义合格括号序列:

1.空序列是一个合格括号序列;

2.如果序列s是一个合格括号序列,那么序列(s)和[s]也是合格括号序列;

3.如果序列a和b是合格括号序列,那么序列ab也是一个合格括号序列。

给你一个序列S,如何去掉最少的括号,使它变成一个合格括号序列?

很容易想到用状态min[i][j]表示把序列S中从i到j之间的子序列变成一个合格括号序列最少需要去掉的括号数。如何算min[i][j]呢?按照规则1,如果i>=j时,min[i][j]=0。按照规则2,如果S[i]=='['&&S[j]==']'或者S[i]=='{'&&S[j]=='}',min[i][j]可能等于min[i+1][j-1]。按照规则3,我们可以把从i到j的子序列看做由2部分组成:A.i到k;b.k+1到j(k是i,j之间的任意划分)。min[i][j]可能等于min[i][k]+min[k+1][j]。通过枚举这些可能,我们就能得到min[i][j]。

好了,现在回到POJ3401--String reduction问题。按照题意,我们可以把该问题抽象成和上面类似的一个问题。我们定义一个合法序列S(也就是能最后消除成一个字符的序列):

1.字符'A'和'B'是合法的;

2.如果S是合法的,那么ASA和BSB是合法的,最后剩下的字符就和S剩下的字符一样;

3.如果S1,S2和S3是合法的,并且S1与S3最后剩下的字符相等,那么S1S2S3是合法的,最后剩下的字符就和S2剩下的字符一样;

现在给你一个序列S,如何利用上面的规则进行消除,使剩下的字符最少?

问题抽象化之后,算最优解就不难了

程序设计 2009-12-20 16:48:31 726次浏览 | 105条评论

POJ2564--Edit Step Ladders:两个单词x和y,如果x通过添加、删除或修改一个字符后变成y,则称x与y是可编辑的。现在给你一个有序字典,如何从中选出尽量多的单词,使它们构成一个升序的单词序列W1<W2<...<Wn,并且相邻的两个单词Wi与Wi+1是可编辑的?

方法1:由构造的序列的有序性(动态规划一般都有这种性质),很容易想到n^2的方法。设max[i]表示第i个单词作为所求序列的最后一个元素时的最大值,max[i] = MAX{max[j]} + 1,j<i且word[j]与word[i]是可编辑的。但n的范围是25000,此方法必定tle。

方法2:方法1是通过判断两个单词是否可编辑来计算max[i]值。我们可以换一种思路思考,可以构造出所有与word[i]是可编辑的单词集合S。题目中说明了单词的长度不超过16,通过添加操作最多可以构造出16*26个单词,通过删除最多可以构造出16个单词,通过替换最多可以构造出16*25个单词,S的总单词数不超过832(其实通过序列的单调性可以去掉很多单词)。接着查找S中的每个单词在字典中的位置(可能不存在,存在确保该位置在i的前面),来算max[i]的值。

如何查找单词在字典的位置呢?

(1).字典有序,二分!每个单词的在二分查找中单词比较需要log(n)次。此方法可行,但耗时较多,用了1s的时间ac。

[p](2).字符串查找问题,字典树Trie可以很方便的解决。S中每个单词的查找只用了该单词长度的字符比较时间(可以认为只做了一次单词比较)。阅读全文
程序设计 2009-12-18 17:04:57 1131次浏览 | 2条评论

动态规划的状态求解是一个枚举过程。一些情况下状态枚举的时间复杂度是线性的。这种情况下,如果问题规模比较大时容易出现超时。而我们知道线段树的查询和插入的时间复杂度是nlog(n)。能不能利用线段树的优点,来加速动态规划的状态枚举过程呢?

例1:POJ1631--Bridging signals

本题是求一个序列的最长上升子序列。常规方法的时间复杂度是n^2。如果利用二分,时间复杂度是nlog(n)。现在我们来想能不能利用线段树,来优化常规的方法。

常规解法: 状态max[i]表示第i个数作为最长上升子序列的最后一个元素时的最大值。 求max[i]的最大值,需要枚举第1个元素,第2个元素,...,第i-1个元素的最大值。

[p]我们换一种思路来思考。假设第i个数的大小是value[i],如果第i个数作为最长上升子序列的最后一个元素的话,那么它前面的元素的值只能是1,2,...,value[i]-1(有些值可能没有,因为这些值必须出现在value[1],value[2],...,value[i-1]中)。如果已经知道了1,2,...,value[i-1](不存在的值,对应的最大值为0)作为最长上升子序列的最后一个元素的值的最大值,那么我们能够得到value[i]作为最长上升子序列的最后一个元素的值的最大值。设max[i]表示i作为最长上升子序列的最后一个元素的值的最大值。那么现在的问题变成了,求区间[1,value[i]-1]中,最大的max值。Good!这个问题恰好是线段树的所擅长的。阅读全文