PKU 1140 - Brackets Sequence (区间dp + 记忆化)

来源:互联网 发布:如何评价阿凡达 知乎 编辑:程序博客网 时间:2024/05/20 02:23

题意

输出最少长度匹配括号

思路

区间dp,其他博客说得很详细了。主要是看没人写记忆化的区间dp,就来一发。

代码

#include <stack>#include <cstdio>#include <list>#include <cassert>#include <set>#include <iostream>#include <string>#include <vector>#include <queue>#include <functional>#include <cstring>#include <algorithm>#include <cctype>#pragma comment(linker, "/STACK:102400000,102400000")#include <string>#include <map>#include <cmath>//#include <ext/pb_ds/assoc_container.hpp>//#include <ext/pb_ds/hash_policy.hpp>using namespace std;//using namespace __gnu_pbds;#define LL long long#define ULL unsigned long long#define SZ(x) (int)x.size()#define lowbit(x) ((x) & (-x))#define MP(a, b) make_pair(a, b)#define MS(p, num) memset(p, num, sizeof(p))#define PB push_back#define X first#define Y second#define ROP freopen("input.txt", "r", stdin);#define MID(a, b) (a + ((b - a) >> 1))#define LC rt << 1, l, mid#define RC rt << 1|1, mid+1, r#define LRT rt << 1#define RRT rt << 1|1#define FOR(i, a, b) for (int i=(a); (i) < (b); (i)++)#define FOOR(i, a, b) for (int i = (a); (i)<=(b); (i)++)const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;const double eps = 1e-8;const int MAXN = 1e4+10;const int MOD = 1e9+7;const int dir[][2] = { {1, 0}, {0, -1}, {-1, 0}, {0, 1} };const int seed = 131;int cases = 0;typedef pair<int, int> pii;char str[1000];int mov[110][110], dp[110][110];bool match(int l, int r){    if (str[l] == '(' && str[r] == ')') return true;    if (str[l] == '[' && str[r] == ']') return true;    return false;}int dfs(int l, int r){    if (l > r) return 0;    if (l == r) return 1;    if (dp[l][r] != -1) return dp[l][r];    int res = INF;    if(match(l, r)) res = dfs(l+1, r-1);    for (int k = l; k < r; k++)    {        if (dfs(l, k) + dfs(k+1, r) < res)        {            res = dfs(l, k) + dfs(k+1, r);            mov[l][r] = k;        }    }    return dp[l][r] = res;}char inv(char c){    if (c == '(') return ')';    if (c == ')') return '(';    if (c == '[') return ']';    if (c == ']') return '[';}void print_ans(int l, int r){    if (l > r) return;    if (l == r)    {        if (str[l] == '(' || str[l] == ')') printf("()");        else printf("[]");        return;    }    if (mov[l][r] == -1)    {        printf("%c", str[l]);        print_ans(l+1, r-1);        printf("%c", str[r]);    }    else    {        print_ans(l, mov[l][r]);        print_ans(mov[l][r]+1, r);    }}int main(){    //ROP;    while (gets(str))    {        MS(dp, -1); MS(mov, -1);        int len = strlen(str);        dfs(0, len-1);        print_ans(0, len-1);        puts("");    }    return 0;}
0 0
原创粉丝点击