POJ 1141-Brackets Sequence(区间dp括号匹配打印路径)
2015-08-17 11:24
507 查看
题目地址:POJ 1141
题意:给出一串由‘(‘)’‘ [ ’ ’ ] ‘组成的串,将给出的括号序列以添加最小数目括号的形式进行配对。
思路:dp[i][j]表示当前子序列需要添加的最小字符数,path存储的是所有子问题的解。然后详情看代码解释。
题意:给出一串由‘(‘)’‘ [ ’ ’ ] ‘组成的串,将给出的括号序列以添加最小数目括号的形式进行配对。
思路:dp[i][j]表示当前子序列需要添加的最小字符数,path存储的是所有子问题的解。然后详情看代码解释。
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #include <stack> #include <map> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; typedef __int64 LL; const int inf=0x3f3f3f3f; const double pi= acos(-1.0); const double esp=1e-7; const int Maxn=110; char str[Maxn]; int path[Maxn][Maxn];//存储的是字符区间[i,j]之间的最佳中间位置 int dp[Maxn][Maxn]; void path_printf(int i,int j)//输出子序列[i,j]的括号方案 { if(i>j) return;//无效位置 if(i==j) {//子序列只有一个字符 if(str[i]=='['||str[i]==']') printf("[]"); else if(str[i]=='('||str[i]==')') printf("()"); } else if(path[i][j]==-1) {//区间[i,j]的最外层位置匹配,递归中间的序列 printf("%c",str[i]); path_printf(i+1,j-1); printf("%c",str[j]); } else {//否则递归[i,k],[k+1,j] path_printf(i,path[i][j]); path_printf(path[i][j]+1,j); } } int main() { while(gets(str)) { int len=strlen(str); if(len==0) {//还有空行的时候,sad printf("\n"); continue; } memset(dp,0,sizeof(dp)); for(int i=0; i<len; i++)//单个括号的匹配 dp[i][i]=1; for(int r=1; r<len; r++) {//r代表递推子序列的长度 for(int i=0; i<len-r; i++) {//枚举子序列的开始位置 int j=i+r;//计算子序列的结束位置 dp[i][j]=inf; if((str[i]=='('&&str[j]==')')||(str[i]=='['&&str[j]==']')) if(dp[i][j]>dp[i+1][j-1]) { dp[i][j]=dp[i+1][j-1]; path[i][j]=-1;//表示括号i,j已经匹配了 } for(int k=i; k<j; k++)//枚举中间的最佳位置 if(dp[i][j]>dp[i][k]+dp[k+1][j]) dp[i][j]=dp[i][k]+dp[k+1][j],path[i][j]=k; } } path_printf(0,len-1); puts(""); } return 0; }
相关文章推荐
- 队列Queue
- 简易UC首页demo续
- 两种盒模型(浏览器的两种模式quirks mode 和strict mode)
- UITableView(可滚动到顶部和底部)
- Android Volley完全解析(三),定制自己的Request
- Codeforces Round #303 (Div. 2) A - Equidistant String(贪心)
- stack、queue、deque的区别
- easyui-tree-url-param
- Request的getParameter和getAttribute方法的区别
- Hdu 3397 Sequence operation 区间合并+区间更新+翻转操作
- 探讨android更新UI的几种方法
- AndroidStudio下BuildTypes和ProductFlavors动态编译并重命名apk
- UIView
- iOS的UITableView的基础数据使用
- Leetcode#53||Maximum Subarray
- Codeforces Round #316 (Div. 2) D. Tree Requests (DFS序)
- Ubiquitous Religions
- EasyUI 基本的拖动和放置
- iOS开发- UICollectionView详解+实例
- EasyUI禁用控制方法常采用