POJ-1141-Brackets Sequence

原创 2018年04月17日 11:04:23

img

题目链接:

Go!

题目大意:

​ 给你一个长度不超过 100 且只包含 (,),[,] 四种字符的字符串 s,添加 最少 的字符使其变成一个合法的字符串,输出这个合法的字符串

合法字符串的定义:
  1. Empty sequence is a regular sequence.
  2. If S is a regular sequence, then (S) and [S] are both regular sequences.
  3. If A and B are regular sequences, then AB is a regular sequence.

样例:

Sample Input

([(]

Sample Output

()[()]

解题思路:

这是一道 区间 dp (路径还原)

  • 状态方程 : dp[i][j] 代表使 区间 (i,j) 形成一个合法的字符串最少需要添加多的字符串?

    path[i][j] 代表添加最少的字符使 区间 (i,j) 形成一个合法的字符串的路径选择。

  • path[i][j] = 1 ,表示头尾。

    path[i][j] = k (k != 1 ) ,表示由 区间 (i,k)区间 (k+1 ,j) 而来。

  • 转移方程

    • 区间 (i,j) 可以由 区间 (i,k) + 区间 (k+1,j) 转移而来。
    • s[i] = s[j] 时,区间 (i,j) 也可以由 区间 (i+1,j1) 转移而来。(需要注意的是:当 i+1=j 时,直接 dp[i][j] = 0,否则会出现 i+1>j1 的情况)
  • 小思考:为什么最外层是枚举 区间长度,而不是直接枚举 区间端点 l,r 呢?

    • 答:因为我们转移的时候是从 小区间 转移到 大区间 的。
  • 最后答案:根据 path[i][j] 记录的值,用递归还原路径。(详情请看代码)

AC代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;

const int maxn = 105;
int dp[maxn][maxn],path[maxn][maxn];
char s[maxn];

void dfs(int l,int r){
    if(l > r) return;
    if(l == r){
        if(s[l] == '(' || s[l] == ')') cout << "()";
        else cout << "[]";
        return;
    }
    if(path[l][r] == -1){
        cout << s[l];//先输出左端点,
        dfs(l + 1,r - 1);//再输出中间,
        cout << s[r];//最后输出右端点。
    }
    else{
        int k = path[l][r];//分两部分输出。
        dfs(l,k);
        dfs(k + 1,r);
    }
}

int main(){
    int n;
    while(gets(s + 1)){
        n = strlen(s + 1);
        memset(dp,0x3f,sizeof(dp));
        memset(path,0,sizeof(path));
        for(int i = 1;i <= n;i++) dp[i][i] = 1;//初始化:自己当然初始化为 1,其他初始化为无穷大。
        for(int len = 2;len <= n;len++){
            for(int l = 1;l <= n - len + 1;l++){
                int r = len + l - 1;
                if((s[l] == '(' && s[r] == ')') || (s[l] == '[' && s[r] == ']')){
                    if(dp[l + 1][r - 1] < dp[l][r]){
                        dp[l][r] = dp[l + 1][r - 1];
                        path[l][r] = -1;
                    }
                    else if(l + 1 == r){
                        dp[l][r] = 0;
                        path[l][r] = -1;
                    }
                }
                for(int k = l;k < r;k++){
                    if(dp[l][k] + dp[k + 1][r] < dp[l][r]){
                        dp[l][r] = dp[l][k] + dp[k + 1][r];
                        path[l][r] = k;
                    }
                }
            }
        }
        dfs(1,n);
        cout << endl;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dreams___/article/details/79971862

Oracle数据库

本课程主要讲解如下内容:Oracle体系结构、Oracle 基础管理、SQL 语言、Sequence和同义词、数据字典及用户管理、E-R模型、Power Designer设计工具。在本课程讲解之中会提供有相应的练习习题以及综合案例分析,帮助读者迅速掌握Oracle数据库的核心开发技能。官方QQ群:612148723。
  • 2016年12月31日 09:04

区间dp+输出方案 poj-1141-Brackets Sequence

题目链接: http://poj.org/problem?id=1141 题目大意: 给一个由[,],{,}组成的字符串序列,求增加最少的字符,使该序列能够匹配,并输出最后的方案。 解题思...
  • cc_again
  • cc_again
  • 2013-08-22 09:15:23
  • 2198

Convolutional Sequence to Sequence Learning

Convolutional Sequence to Sequence Learning Jonas Gehring, Michael Auli, David Grangier, Denis ...
  • AMDS123
  • AMDS123
  • 2017-05-10 17:14:32
  • 7004

【论文阅读】Convolutional Sequence to Sequence Learning (未完待续)

论文github地址   值得阅读与一试:  https://github.com/facebookresearch/fairseq 以往谈到sequence  to sequence,往往会下意识...
  • chengdezhi2011
  • chengdezhi2011
  • 2017-06-14 10:01:13
  • 1882

(翻译)Sequence to Sequence Learning with Neural Networks

2 模型 RNN,给定一个输入序列(x1,x2,…,xT),RNN通过循环计算下面的式子得到一个输出序列(y1,y2,…,yT) 如何一个input和output是对应的,比如输入单词,输出是...
  • guotong1988
  • guotong1988
  • 2016-09-02 15:01:28
  • 1503

PostgreSQL之sequence

转载来自:http://blog.chinaunix.net/uid-24774106-id-3973781.html
  • huguangshanse00
  • huguangshanse00
  • 2014-11-22 18:33:16
  • 2310

【每周一文】Sequence to Sequence Learning with Neural Networks(2014)

概述 DNN已经被成功用于多种AI任务,并取得很多可喜的成绩,例如语音识别、图片分类等。然而它们都不能处理序列到序列的任务,该文提出了一个端到端的(End To End)模型处理序列到序列的任务。 ...
  • fangqingan_java
  • fangqingan_java
  • 2016-11-20 11:24:03
  • 1441

【论文笔记】Sequence to sequence Learning with Neural Networks

本文模型:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/models/rnn/translate 前一段时间...
  • qq_35647180
  • qq_35647180
  • 2016-12-11 23:36:57
  • 2469

Sequence to Sequence 模型

使用 Keras 实现简单的 Sequence to Sequence 模型 Learning Phrase Representation using RNN Encode-Decoder for ...
  • u012871493
  • u012871493
  • 2017-03-25 10:58:16
  • 558

Edward Grefenstette - Beyond Sequence to Sequence with Augmented RNNs

  • 2017年05月25日 14:12
  • 3.29MB
  • 下载
收藏助手
不良信息举报
您举报文章:POJ-1141-Brackets Sequence
举报原因:
原因补充:

(最多只允许输入30个字)