POJ2955解题报告

有些日子不写博客了,前些天和张老师交流,觉得写给自己看看,还是非常有必要的。
这个题目是括号匹配的题目,我遇到过两种类型1)问是否可以匹配;2)问匹配的最大长度有多少;思路差不多。这个题目时候一个情况。合法情况如下:s代表字符串
  1. s是空串,则s是合法的--递归的终止条件
  2. s是合法的,那么(s),[s]是合法的--递归的一种情况
  3. 如果s1,s2是合法的,那么s1s2是合法的--递归的另一种情况
  4. 其它的都不合法
上面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报告。算法这个东西,越是学习,我越觉得博大精深,另一方面也觉得有章可循,几个几个方法学的东西,然后又可以充斥着技巧,写完的代码,很少能被看懂。

posted on 2012-04-23 13:12  sing1ee  阅读(538)  评论(0)    收藏  举报