您的位置:首页 > 产品设计 > UI/UE

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: