有些日子不写博客了,前些天和张老师交流,觉得写给自己看看,还是非常有必要的。
这个题目是括号匹配的题目,我遇到过两种类型1)问是否可以匹配;2)问匹配的最大长度有多少;思路差不多。这个题目时候一个情况。合法情况如下:s代表字符串
- s是空串,则s是合法的--递归的终止条件
- s是合法的,那么(s),[s]是合法的--递归的一种情况
- 如果s1,s2是合法的,那么s1s2是合法的--递归的另一种情况
- 其它的都不合法
上面2,3两种情况的所有可能取最大就是最后的长度,二维数据保存中间结果,最终的结果就是dp[0][strlen(s) -1]。核心代码如下:
while(scanf("%s", line) != EOF && strcmp(line, "end")) {
int len = strlen(line);
memset(dp, 0, sizeof(dp));
for (int i = 1; i < len; ++i) {
if ((line[i - 1] == '[' && line[i] == ']') || (line[i - 1] == '(' && line[i] == ')'))
dp[i - 1][i] = 2;
}
for (int i = len - 2; i >= 0; --i) {
for (int j = i + 2; j < len; ++j) {
if ((line[i] == '[' && line[j] == ']') || (line[i] == '(' && line[j] == ')'))
dp[i][j] = 2 + dp[i + 1][j - 1];
for (int k = i; k < j; ++k) {
int tmp = dp[i][k] + dp[k + 1][j];
if(tmp > dp[i][j]) dp[i][j] = tmp;
}
}
}
printf("%d\n", dp[0][len - 1]);
}
看了看日期,竟然有一个多月没有写了。似乎要坚持一下,哪怕一篇ACM报告。算法这个东西,越是学习,我越觉得博大精深,另一方面也觉得有章可循,几个几个方法学的东西,然后又可以充斥着技巧,写完的代码,很少能被看懂。