Brackets Sequence(记搜)

来源:互联网 发布:双色球软件2016破解版 编辑:程序博客网 时间:2024/05/21 10:18

http://poj.org/problem?id=1141


#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <map>#include <iostream>#include <stdexcept>#include <cstddef>#include <algorithm>#include <vector>#include <numeric>#include <cctype>#define LL long long#define Endl endl#define INF 0x7fffffff//#define WJusing namespace std;const int maxn=105;char str[maxn];bool vis[maxn][maxn];int DFS[maxn][maxn],pos[maxn][maxn];int dfs(int l,int r){if(vis[l][r]) return DFS[l][r];if(l>r) return 0;if(l==r) return 1;int ans=INF;if((str[l]=='('&&str[r]==')')||(str[l]=='['&&str[r]==']')){ans=min(ans,dfs(l+1,r-1));pos[l][r]=-1;}for(int i=l;i<r;i++){int jian=dfs(l,i)+dfs(i+1,r);if(ans>jian){ans=jian; pos[l][r]=i;}}vis[l][r]=1;return DFS[l][r]=ans;}void print(int l,int r){if(l>r) return ;if(l==r){if(str[l]=='('||str[l]==')')printf("()");else printf("[]");}else if(pos[l][r]==-1){cout<<str[l];print(l+1,r-1);cout<<str[r];}else {print(l,pos[l][r]);print(pos[l][r]+1,r);}}int main(int argc, char *argv[]){#ifdef WJ//freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifmemset(vis,0,sizeof(vis));scanf("%s",str);int len=strlen(str);dfs(0,len-1);print(0,len-1);printf("\n");return 0;}


0 0