POJ 1141 Brackets Sequence (区间DP)
Description
1. Empty sequence is a regular sequence.
2. If S is a regular sequence, then (S) and [S] are both regular sequences.
3. If A and B are regular sequences, then AB is a regular sequence.
For example, all of the following sequences of characters are regular brackets sequences:
(), [], (()), ([]), ()[], ()[()]
And all of the following character sequences are not:
(, [, ), )(, ([)], ([(]
Some sequence of characters '(', ')', '[', and ']' is given. You are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. Here, a string a1 a2 ... an is called a subsequence of the string b1 b2
... bm, if there exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij for all 1 = j = n.
Input
Output
Sample Input
([(]
Sample Output
()[()]
题意:给一串括号序列。依照合法括号的定义,加入若干括号,使得序列合法。
典型区间DP。设dp[i][j]为从i到j须要加入最少括号的数目。
dp[i][j] = max{ dp[i][k]+dp[k+1][j] } (i<=k<j)
假设s[i] == s[j] , dp[i][j] 还要和dp[i+1][j-1]比較。 枚举顺序依照区间长度枚举。
由于要求输出合法序列,就要记录在原序列在哪些位置进行了添加,设c[i][j]为从i到j的 添加括号的位置,假设不须要添加。那么c[i][j] 赋为-1,打印时仅仅需递归打印就可以。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long LL;
const int MAX=0x3f3f3f3f;
int n,c[105][105],dp[105][105];
char s[105];
void print(int i,int j) {
if( i>j ) return ;
if( i == j ) {
if(s[i] == '(' || s[i] == ')') printf("()");
else printf("[]");
return ;
}
if( c[i][j] > 0 ) { // i到j存在添加括号的地方,位置为c[i][j]
print(i,c[i][j]);
print(c[i][j]+1,j);
} else {
if( s[i] == '(' ) {
printf("(");
print(i+1,j-1);
printf(")");
} else {
printf("[");
print(i+1,j-1);
printf("]");
}
}
}
void DP() { //区间DP
for(int len=2;len<=n;len++)
for(int i=1;i<=n-len+1;i++) {
int j = i+len-1;
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];
c[i][j] = k; // 记录断开的位置
}
if( ( s[i] == '(' && s[j] == ')' || s[i] == '[' && s[j] == ']' ) && dp[i][j] > dp[i+1][j-1] ) {
dp[i][j] = dp[i+1][j-1];
c[i][j] = -1; //i到j不须要断开。由于dp[i+1][j-1]的值更小,上面枚举的k位置都比这个大。所以不再断开
}
}
}
int main()
{
scanf("%s",s+1);
n = strlen(s+1);
memset(c,-1,sizeof(c));
memset(dp,MAX,sizeof(c));
for(int i=1;i<=n;i++) dp[i][i] = 1, dp[i][i-1] = 0; //赋初值
DP();
print(1,n);
printf("\n");
return 0;
}
POJ 1141 Brackets Sequence (区间DP)的更多相关文章
- POJ 1141 Brackets Sequence(区间DP, DP打印路径)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- poj 1141 Brackets Sequence 区间dp,分块记录
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35049 Accepted: 101 ...
- poj 1141 Brackets Sequence (区间dp)
题目链接:http://poj.org/problem?id=1141 题解:求已知子串最短的括号完备的全序列 代码: #include<iostream> #include<cst ...
- poj 1141 Brackets Sequence ( 区间dp+输出方案 )
http://blog.csdn.net/cc_again/article/details/10169643 http://blog.csdn.net/lijiecsu/article/details ...
- 区间DP POJ 1141 Brackets Sequence
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29520 Accepted: 840 ...
- POJ 1141 Brackets Sequence(括号匹配二)
题目链接:http://poj.org/problem?id=1141 题目大意:给你一串字符串,让你补全括号,要求补得括号最少,并输出补全后的结果. 解题思路: 开始想的是利用相邻子区间,即dp[i ...
- POJ 2955 Brackets (区间dp入门)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- POJ 1141 Brackets Sequence
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 840 ...
- Poj 2955 brackets(区间dp)
Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7795 Accepted: 4136 Descript ...
随机推荐
- hdu5443 The Water Problem
The Water Problem Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- 九度oj 题目1459:Prime ring problem
题目描述: A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each ...
- SPOJ 3267 D-query(离散化+在线主席树 | 离线树状数组)
DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ...
- NOJ——1508火烧赤壁2(并查集+启发式合并+逆序加边)
[1508] 火烧赤壁2 时间限制: 1000 ms 内存限制: 65535 K 问题描述 上次出了一道火烧赤壁的题目给当时的新生,也就是你们的上一届学长们做,那么这次,我又想到了另一个想法. 上次的 ...
- Eclipse项目类型转换
例如,将一个普通java项目改为动态Web项目: 在eclipse的项目上点右键,刷新项目. 在项目上点右键,进入属性(properties) 在左侧列表项目中点击选择“Project Facets” ...
- 一个简单的django user.is_authenticated问题
Q1:这是我一个view函数: def user_info(request): response=HttpResponse() user=request.user user_id=user.id if ...
- TroubleShoot:The context has expired (0×80090317)
网上搜了一下,服务器上的时间不正确,在SharePoint 设置中,可以通过管理中心设置下Time Zone 和服务器的时间上一致.
- Error querying database找不到数据库的错误可能发生的原因..
这个问题纠结了大概两个小时.原因是这样的,我刚刚换了一台新的电脑,准备把以前电脑上自己搭建的小项目放到新电脑上面,用myeclipse引入项目之后,启动项目在浏览器跑起来.然后输入账号密码登录主页,报 ...
- linux内核之进程的基本概念(进程,进程组,会话关系)
进程是操作系统的一个核心概念.每个进程都有自己唯一的标识:进程ID,也有自己的生命周期.一个典型的进程的生命周期如图4-1所示. 进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家 ...
- 快速比對 修改的檔案 使用 Beyond Compare Filters & git & sed
修改 code 後, 想使用 beyond compare 比對 修改前後的 code (有一包未修改的 code), 若 code 很大, 全部比完,需要花很多時間, Command 此時可以使用 ...