POJ 1141 Brackets Sequence(动态规划)
题目大意
给你一个括号串(包括'(',')','[',']'),长度不超过 100,问你怎么添加最少的括号,使得这个括号串是合法的,输出添加括号后的合法括号串
做法分析
以长度划分阶段,定义状态:f[i][j] 表示,s(i)~s(j) 这一个字串需要添加多少括号使得其变为合法字串,状态转移:
f[i][j]=min{ f[i][k]+f[k+1][j] }
有一个特殊的地方就是:s(i) 和 s(j) 是两个匹配的括号,即:s(i)=='(' && s(j)==')' || s(i)=='[' && s[j]==']',那么 f[i][j] 还要和 f[i+1][j-1] 相比取最小者
最后输出的时候,递归的输出就行
这是今天无意间翻到的,不知道是什么时候看见了没有想法的一道题,没想到今天瞬间就把思路给秒了...这么水的DP,当时怎么会没想法呢?
参考代码
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 using namespace std; 6 7 const int N=106; 8 9 char buff[N]; 10 int f[N][N], pre[N][N]; 11 12 void Print(int L, int R) 13 { 14 if(L>R) return; 15 if(L==R) 16 { 17 if(buff[L]=='[' || buff[L]==']') printf("[]"); 18 else printf("()"); 19 } 20 else if(pre[L][R]==-1) 21 { 22 printf("%c", buff[L]); 23 Print(L+1, R-1); 24 printf("%c", buff[R]); 25 } 26 else Print(L, pre[L][R]), Print(pre[L][R]+1, R); 27 } 28 29 int main() 30 { 31 while(gets(buff)) 32 { 33 int n=(int)strlen(buff); 34 memset(f, 0, sizeof f); 35 for(int i=0; i<n; i++) f[i][i]=1, pre[i][i]=0; 36 for(int len=2; len<=n; len++) 37 { 38 for(int i=0; i+len-1<n; i++) 39 { 40 int j=i+len-1; 41 f[i][j]=0x3ffffff; 42 if(buff[i]=='[' && buff[j]==']' || buff[i]=='(' && buff[j]==')') 43 f[i][j]=f[i+1][j-1], pre[i][j]=-1; 44 for(int k=i; k<j; k++) 45 if(f[i][j]>f[i][k]+f[k+1][j]) 46 f[i][j]=f[i][k]+f[k+1][j], pre[i][j]=k; 47 } 48 } 49 Print(0, n-1), printf("\n"); 50 } 51 return 0; 52 }
题目链接 & AC通道
POJ 1141 Brackets Sequence
转载于:https://www.cnblogs.com/zhj5chengfeng/archive/2013/05/07/3066020.html
POJ 1141 Brackets Sequence(动态规划)相关推荐
- POJ 1141 Brackets Sequence
括号序列,刘汝佳黑书上的经典例题.但是这道题要输出我们最后得到的添加括号最少的序列, 输出序列确实很麻烦,参考了题解,才勉勉强强写出来,以后还得把这道题敲一遍. /*Accepted 288K 32M ...
- POJ 2955 Brackets (区间DP)
题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)
整理的算法模板合集: ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下: 空序列是正规括号序列. 如果 SSS 是一个正规括号序列,那么 (S) 和 [S] ...
- COJ-1271 Brackets Sequence
斌牛出的校赛题 1271: Brackets Sequence Time Limit: 1 Sec Memory Limit: 128 MB Submit: 92 Solved: 36 [Subm ...
- UVA1626 / ZOJ1463 Brackets sequence 区间DP
简单区间DP (有空串... ...) Brackets sequence Time Limit: 4500MS Memory Limit: Unknown 64bit IO Format: ...
- uva 1626 - Brackets sequence
// // main.cpp // uva 1626 - Brackets sequence/*这一题应该是经典的矩阵类似问题.显然 需要使用两个变量来表示最终的结果.设 dp[i][j]表示第i个位 ...
- POJ 2778 DNA Sequence [AC自动机 + 矩阵快速幂]
http://poj.org/problem?id=2778 题意:给一些只由ACGT组成的模式串,问有多少种长度为n且不含有给出的模式串的DNA序列. 自动机的状态转换可以看成一个有向图(有重边的) ...
- POJ 2955 Brackets(括号匹配一)
题目链接:http://poj.org/problem?id=2955 题目大意:给你一串字符串,求最大的括号匹配数. 解题思路: 设dp[i][j]是[i,j]的最大括号匹配对数. 则得到状态转移方 ...
- J - Milking Time POJ - 3616(dp动态规划)
Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that sh ...
最新文章
- C++ sizeof 运算符的使用
- ssh 登陆mysql数据库_mysql命令行客户端如何通过ssh服务器连接数据库啊?
- 利用DDA算法得到直线上的像素点坐标
- 找出数组中不重复的值php_PHP查找数值数组中不重复最大和最小的10个数的方法...
- T-SQL 将存储过程结果插入到表中
- 编程题:编写一个函数string_copy()完成strcpy()的作用,并验证。
- php备份和恢复源码,PHP数据库备份还原类
- 利用python绘制雪景图_python绘制雪景图
- 用指针交换两个数_LeetCode双指针系列
- C#使用SharpZipLib实现zip压缩
- 工业大数据的应用有哪些
- 阿里云发布异构计算产品家族,你可以在上面模拟核爆炸
- Java企业微信开发_02_通讯录同步
- 电影院订票选座小程序 电影小程序毕业设计 毕业论文 开题报告和效果图
- Eggjs笔记:详解Mongoose的聚合管道以及populate实现关联查询
- win10资源管理器——删除左侧图标(自用)
- 1484: 青蛙(四)
- 如何制作独一无二的简历?
- 升级AndroidX
- 操作系统常见驱动故障及解决方法