poj1141 Brackets Sequence

黑书p113上的题。

我的思路:

f[i][j]:i-j的最短规则序列长度

f[i][j] = f[i][j - 1] + 2;

当 s[j] == ')' && s[k] == '(' || s[j] == ']' && s[k] == '[' 时

  f[i][j] <?= f[i][k - 1] + f[k + 1][j];

/**
 * Problem:POJ1141
 * Author:Shun Yao
 * Time:2013.5.19
 * Result:Accepted
 * Memo:DP
 */

#include <cstring>
#include <cstdlib>
#include <cstdio>

using namespace std;

long n, f[105][105], g[105][105];
char s[105];

void print_the_solution(long i, long j) {
	if (i > j)
		return;
	if (!g[i][j]) {
		print_the_solution(i, j - 1);
		if (s[j] == '(' || s[j] == ')')
			printf("()");
		else
			printf("[]");
	} else {
		print_the_solution(i, g[i][j] - 1);
		printf("%c", s[g[i][j]]);
		print_the_solution(g[i][j] + 1, j - 1);
		printf("%c", s[j]);
	}
}

int main() {
	static long i, j, k, l, tmp;
	freopen("poj1141.in", "r", stdin);
	freopen("poj1141.out", "w", stdout);
	scanf("%s", s + 1);
	n = strlen(s + 1);
	for (i = 1; i <= n; ++i) {
		memset(f[i], 0, sizeof f[i]);
		memset(g[i], 0, sizeof g[i]);
		f[i][i] = 2;
	}
	for (l = 2; l <= n; ++l)
		for (i = 1; i <= n - l + 1; ++i) {
			j = i + l - 1;
			f[i][j] = f[i][j - 1];
			if (s[j] == ']') {
				for (k = i; k < j; ++k)
					if (s[k] == '[' && f[i][j] > (tmp = f[i][k - 1] + f[k + 1][j - 1])) {
						f[i][j] = tmp;
						g[i][j] = k;
					}
			} else if (s[j] == ')') {
				for (k = i; k < j; ++k)
					if (s[k] == '(' && f[i][j] > (tmp = f[i][k - 1] + f[k + 1][j - 1])) {
						f[i][j] = tmp;
						g[i][j] = k;
					}
			}
			f[i][j] += 2;
		}
	print_the_solution(1, n);
	putchar('\n');
	fclose(stdin);
	fclose(stdout);
	return 0;
}


作者:HSUPPR
出处:http://www.cnblogs.com/hsuppr/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/hsuppr/p/3087624.html