DP一题解题报告POJ1141 Brackets Sequence
2010-08-11 19:20
483 查看
题目出处:http://acm.pku.edu.cn/JudgeOnline/problem?id=1141
版权声明:版权归作者WeiSteven所有,转载请注明!
基本题意是给定一个只包含()[]的字符串,题目要求算法能够求的包含这个字符串的最短的匹配字符串。
(匹配字符串指满足成对,且成对里面的字符串也是成对的)
比如:
([
包含它的最短字符串是()[]或者([])
两个都是满足题意的,所以此题不一定只有一个解(Special Judge)
题目可以用DP来做:
DP[i][j]:指字符串i~~~j中字符串能够匹配的最短字符串
状态转移方程:DP[i][j]=min(DP[i][m]+DP[m][j]),其中m是从i+1到j-1的。
打印出的字符串也是通过递归来完成的。
1 #include <iostream>
2 #include <string.h>
3 using namespace std;
4 string s;
5 int d[101][101],p[101][101],len;
6 void dp(){
7 for(int i=0;i<len;i++) d[i][i]=1;
8 for(int k=1;k<len;k++)
9 for(int i=0;i<len-k;i++)
{ int j=i+k;
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')){d[i][j]=d[i+1][j-1];p[i][j]=-1;}
else
d[i][j]=65535;
for(int m=i;m<j;m++)
if(d[i][j]>d[i][m]+d[m+1][j]){
d[i][j]=d[i][m]+d[m+1][j];
p[i][j]=m;
}
}
}
void output(int i,int j){
if(i>j) return;
if(i==j){
switch(s[i]){
case ')': case '(':cout<<"()"; break;
case ']': case '[':cout<<"[]"; break;
}
}else if(p[i][j] == -1){
cout<<s[i];output(i+1, j-1);cout<<s[j];
}else{output(i,p[i][j]);output(p[i][j]+1,j);}
}
int main(){
while(getline(cin,s)){
memset(d,0,sizeof(d));
len=s.length();
dp();
output(0,len-1);
cout<<endl;
}
return 0;
}
版权声明:版权归作者WeiSteven所有,转载请注明!
基本题意是给定一个只包含()[]的字符串,题目要求算法能够求的包含这个字符串的最短的匹配字符串。
(匹配字符串指满足成对,且成对里面的字符串也是成对的)
比如:
([
包含它的最短字符串是()[]或者([])
两个都是满足题意的,所以此题不一定只有一个解(Special Judge)
题目可以用DP来做:
DP[i][j]:指字符串i~~~j中字符串能够匹配的最短字符串
状态转移方程:DP[i][j]=min(DP[i][m]+DP[m][j]),其中m是从i+1到j-1的。
打印出的字符串也是通过递归来完成的。
1 #include <iostream>
2 #include <string.h>
3 using namespace std;
4 string s;
5 int d[101][101],p[101][101],len;
6 void dp(){
7 for(int i=0;i<len;i++) d[i][i]=1;
8 for(int k=1;k<len;k++)
9 for(int i=0;i<len-k;i++)
{ int j=i+k;
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')){d[i][j]=d[i+1][j-1];p[i][j]=-1;}
else
d[i][j]=65535;
for(int m=i;m<j;m++)
if(d[i][j]>d[i][m]+d[m+1][j]){
d[i][j]=d[i][m]+d[m+1][j];
p[i][j]=m;
}
}
}
void output(int i,int j){
if(i>j) return;
if(i==j){
switch(s[i]){
case ')': case '(':cout<<"()"; break;
case ']': case '[':cout<<"[]"; break;
}
}else if(p[i][j] == -1){
cout<<s[i];output(i+1, j-1);cout<<s[j];
}else{output(i,p[i][j]);output(p[i][j]+1,j);}
}
int main(){
while(getline(cin,s)){
memset(d,0,sizeof(d));
len=s.length();
dp();
output(0,len-1);
cout<<endl;
}
return 0;
}
相关文章推荐
- DP一题解题报告POJ1141 Brackets Sequence
- Codeforces 459E 图上DP 解题报告
- BZOJ 1419 DP 解题报告
- BZOJ 1801 [Ahoi 2009] DP 解题报告
- HDU 2089 数位DP 解题报告
- Timus 1807. Cartridges for Maxim 解题报告(DP+数学)
- [USACO06NOV]玉米田Corn Fields 解题报告(状压DP)
- pku 1185 炮兵阵地 压缩dp 解题报告
- pku 1141 Bracket Sequence DP 解题报告
- FZU 1977 Pandora adventure 解题报告(插头DP)
- [dp]POJ 3176 Cow Bowling解题报告
- Codeforces Round #393 (Div. 2) D题Travel Card(map,dp)解题报告
- codevs 3027 线段覆盖 2 解题报告 (序列型DP)
- bzoj 4318 期望DP 解题报告
- NOIP 2000乘积最大 解题报告(划分型DP)
- 最大报销额 (HDU 1864)解题报告(DP - 01 - 背包)
- timus 1346. Intervals of Monotonicity URAL 解题报告 DP 小水题,阅读理解
- CodeVS 1090 [NOIP 2003] 区间DP 解题报告
- HDU3586 Information Disturbing 解题报告【树形DP】
- CodeVS3327 选择数字 解题报告【单调队列优化DP】