POJ 1141-Brackets Sequence(区间dp括号匹配打印路径)
来源:互联网 发布:打车 数据 编辑:程序博客网 时间:2024/06/05 11:55
题目地址:POJ 1141
题意:给出一串由‘(‘)’‘ [ ’ ’ ] ‘组成的串,将给出的括号序列以添加最小数目括号的形式进行配对。
思路: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;}
1 0
- POJ 1141-Brackets Sequence(区间dp括号匹配打印路径)
- POJ 1141 Brackets Sequence (区间dp 括号匹配 经典题)
- POJ 1141 Brackets Sequence 括号匹配 区间DP
- POJ 1141 Brackets Sequence 区间DP(括号匹配)
- POJ 1141 / UVa 1626 Brackets Sequence (区间DP&打印路径)
- poj 1141 Brackets Sequence(区间DP+路径打印)
- uva1626 poj 1141 Brackets Sequence 区间dp 打印路径
- POJ1141 Brackets Sequence (最小括号匹配升级版:区间DP+打印路径)
- UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)
- POJ 1142 Brackets Sequence(区间dp,记录路径,还原括号匹配)
- poj1141Brackets Sequence(区间dp括号匹配打印路径)
- POJ 2955 Brackets 括号匹配 区间DP
- POJ 2955 Brackets (区间dp 括号匹配)
- poj 2955 Brackets 括号匹配 区间dp
- [区间DP入门 括号匹配]Brackets POJ
- poj 1141 Brackets Sequence 【区间DP+路径记录】
- POJ 1141 Brackets Sequence (区间dp 记录路径)
- poj 1141 Brackets Sequence(区间DP记录路径)
- SQL 當月上月月初月末
- SecureCTR连接服务器
- Mybatis整合Spring
- USB之(三)USB描述符和命令(请求)
- 视频码率,帧率和分辨率的联系与区别
- POJ 1141-Brackets Sequence(区间dp括号匹配打印路径)
- learn_python 函数
- 浅析Java数组声明、创建、初始化
- javascript object 相等判断逻辑
- Android spinner省市联动以及Xml解析
- HDU 2457 DNA repair (AC自动机 + DP)
- 分布式缓存
- USB之(四)HID设备类协议
- innobackupex参数之--incremental