poj 1141 Brackets Sequence 区间dp,分块记录
| Time Limit: 1000MS | Memory Limit: 65536K | |||
| Total Submissions: 35049 | Accepted: 10139 | Special Judge | ||
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
()[()] 题意:用最少的括号,补全答案。 看完题目第一想法可能是,不停地往读入的字符串中插入括号,但这样很难判断哪些是已有的匹配括号。 所以我们可以用一个二维数组pos记录片段,用dp记录区域间最少的的需要补全的括号。 初始化dp[i][i]为1,然后更新dp时顺便更新pos。
然后按pos更新。 注:这题目不知道什么鬼,最后需要输出一个 '\n',否则wa。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int N=;
char s[N];
int dp[N][N],pos[N][N]; bool march(char a,char b)
{
if(a=='('&&b==')'||a=='['&&b==']')
return true;
else
return false;
} void print(int i,int e)
{
if(i>e)
return;
else if(i==e)
{
if(s[i]=='('||s[i]==')')
printf("()");
else if(s[i]=='['||s[i]==']')
printf("[]"); }
else if(pos[i][e]==-)
{
printf("%c",s[i]);
print(i+,e-);
printf("%c",s[e]);
}
else
{
print(i,pos[i][e]);
print(pos[i][e]+,e);
}
} int main()
{
// freopen("input.txt","r",stdin);
gets(s);
// cin>>s;
int len=strlen(s);
memset(dp,,sizeof dp);
memset(pos,,sizeof pos);
for(int i=;i<len;i++)
{
dp[i][i]=;
}
for(int l=;l<len;l++)
{
for(int i=;l+i<len;i++)
{
int e=l+i;
dp[i][e] = 0x7fffffff;
if(march(s[i],s[e]))
{
dp[i][e]=dp[i+][e-];
pos[i][e]=-;
// cout<<"匹配:"<<i<<' '<<e<<' '<<dp[i][e]<<endl;
} for(int j=i;j<e;j++)
{
if(dp[i][e]>dp[i][j]+dp[j+][e])
{
dp[i][e]=dp[i][j]+dp[j+][e];
pos[i][e]=j;
// cout<<i<<' '<<e<<' '<<dp[i][e]<<endl;
}
}
}
}
print(,len-);
printf("\n");
}
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)
题目链接: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 (区间DP)
Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a r ...
- 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 ...
随机推荐
- Android中刷新Invalidate和postInvalidate的区别
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用.Android提供了Inval ...
- 关闭Cadence Orcad Capture CIS原理图弹出startpage页面的方法
打开原理图工具 Orcad Capture CIS 时,总是会弹出startpage 页面,有时候感觉这个东西挺碍事的,还是关了感觉好.解决方法如下:(1) View---Toolbar----Com ...
- RAS算法简单示例(Java版)
RSA算法——由三位发明者Ronald Rivest.Adi Shamir 和 Leonard Adleman 姓氏的首字母拼在一起组成. RSA算法属于“公开密钥加密技术”,其加密和解密的秘钥不同. ...
- pycharm 激活码
http://www.cnblogs.com/itfat/p/9388829.html
- unity检测鼠标是点击在UI上还是物体上
void Update() { if (Input.GetMouseButtonDown(0)||(Input.touchCount >0 && Input.GetTouch(0 ...
- OPNET下op_pk_copy()函数使用注意事项
1)op_pk_copy()是生成新的数据包,函数op_pk_create_time_get()获取的是新数据包的生成时间.在统计数据包的端到端时延,以及服务时延需要注意. 2)此外发用数据包时使用o ...
- 初识异步、并发处理纯代码及Demo
多线程Thread 处理 Thread thread = new Thread(()=> { ; i < ; i++) { Console.WriteLine("这是第" ...
- ActiveMQ(3)---ActiveMQ原理分析之消息持久化
持久化消息和非持久化消息的存储原理 正常情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的.能够存储的最大消息数据在${ActiveMQ_HOME}/conf/activemq.xml文 ...
- 6. spring启动类配置问题
1. @SpringBootApplication(scanBasePackages={"com.example.*"}) 相当与 @SpringBootApplication @ ...
- 打包发布到Tomcat
idea: file-->project structure --> Artifacts --> 点+号 web application exploded from m ...