POJ 1141 Brackets Sequence (区间DP)

Posted dwtfukgv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1141 Brackets Sequence (区间DP)相关的知识,希望对你有一定的参考价值。

题意:给定一个括号序列,让你添加最少的括号,使得所有的括号都匹配。

析:首先用DP来把这个最少的找出来,然后再打印出解,dp[i][j]表示从 i 到 j 所要添加最少的数。

注意有空行的数据。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
//#include <tr1/unordered_map>
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std;
//using namespace std :: tr1;

typedef long long LL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const double inf = 0x3f3f3f3f3f3f;
const LL LNF = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 100 + 5;
const int mod = 1e9 + 7;
const int N = 1e6 + 5;
const int dr[] = {-1, 0, 1, 0, 1, 1, -1, -1};
const int dc[] = {0, 1, 0, -1, 1, -1, 1, -1};
const char *Hex[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
inline LL gcd(LL a, LL b){  return b == 0 ? a : gcd(b, a%b); }
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline int Min(int a, int b){ return a < b ? a : b; }
inline int Max(int a, int b){ return a > b ? a : b; }
inline LL Min(LL a, LL b){ return a < b ? a : b; }
inline LL Max(LL a, LL b){ return a > b ? a : b; }
inline bool is_in(int r, int c){
    return r >= 0 && r < n && c >= 0 && c < m;
}
char s[maxn];
int dp[maxn][maxn];

bool judge(int i, int j){
    if(s[i] == ‘(‘ && s[j] == ‘)‘)  return true;
    if(s[i] == ‘[‘ && s[j] == ‘]‘)  return true;
    return false;
}

void print(int i, int j){
    if(i > j)  return ;
    if(i == j){
        if(s[i] == ‘(‘ || s[i] == ‘)‘)  printf("()");
        else printf("[]");
        return ;
    }
    int ans = dp[i][j];
    if(judge(i, j) && ans == dp[i+1][j-1]){
        printf("%c", s[i]);  print(i+1, j-1); printf("%c", s[j]);
        return ;
    }
    for(int k = i; k < j; ++k) if(ans == dp[i][k]+dp[k+1][j]){
        print(i, k); print(k+1, j);
        return ;
    }
}

int main(){
    while(gets(s) != NULL){
        n = strlen(s);
        memset(dp, INF, sizeof dp);
        for(int i = 0; i < n; ++i)  dp[i][i] = 1, dp[i+1][i] = 0;
        for(int i = n-2; i >= 0; --i)
            for(int j= i+1; j < n; ++j){
                dp[i][j] = INF;
                if(judge(i, j))  dp[i][j] = dp[i+1][j-1];
                for(int k = i; k < j; ++k)
                    dp[i][j] = Min(dp[i][j], dp[i][k]+dp[k+1][j]);
            }

        print(0, n-1);
        printf("\n");
    }
    return 0;
}

 

以上是关于POJ 1141 Brackets Sequence (区间DP)的主要内容,如果未能解决你的问题,请参考以下文章

POJ1141 Brackets Sequence

POJ 1141 Brackets Sequence

poj 1141 Brackets Sequence

POJ 1141 —— Brackets Sequence

POJ 1141 Brackets Sequence (区间DP)

poj 1141 Brackets Sequence (区间DP)