zoukankan      html  css  js  c++  java
  • 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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    Ubuntn16.04+OpenCV3.1+CUDA8.0+cudnn5.1+caffe配置及问题集锦
    理解最短路径-Dijkstra算法
    使用git命令从github上clone项目
    Vscode中问题
    windows和ubuntn互传文件
    Python中的一些模块用法
    机器学习中矩阵的求导知识
    训练集,验证集,测试集
    Javascript、Jquery获取浏览器和屏幕各种高度宽度
    DTCMS规格统一赋值
  • 原文地址:https://www.cnblogs.com/hsuppr/p/3087624.html
Copyright © 2011-2022 走看看