| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
my codeIn Reply To:Re:那位帮忙看一下,小的测试数据都是对的,为什么已提交就是RunTime Error呢 Posted by:luckyyang at 2009-06-08 19:30:38 //保持下标一致,必须使得s[k-1]的形式
#include <iostream>
#include<string>
using namespace std;
const int inf=30000;
const int Max=100;
const int front=-1;
const int back=-2;
const int none=0;
void solve(int pos[Max+1][Max+1],int i,int j,string s,char symbol[Max+1][Max+1]);
int main()
{
int n, j;string s;
int d[Max+1][Max+1],pos[Max+1][Max+1];
char symbol[Max+1][Max+1];
memset(&d,0,sizeof(int)*(Max+1)*(Max+1));
memset(&pos,0,sizeof(int)*(Max+1)*(Max+1));
memset(&symbol,0,sizeof(int)*(Max+1)*(Max+1));
cin>>s;
n=(int)s.length();
for(int k=1;k<=n;k++)
{
d[k][k]=1;
if(s[k-1]=='(')
{
pos[k][k]=back;//在后面插入字符
symbol[k][k]=')';
}
else if(s[k-1]==')')
{
pos[k][k]=front;//在前面插入字符
symbol[k][k]='(';
}
else if(s[k-1]=='[')
{
pos[k][k]=back;//后插
symbol[k][k]=']';
}
else
{
pos[k][k]=front;//前插
symbol[k][k]='[';
}
}
for(int k=1;k<=n-1;k++)//阶段
for(int i=1;i<=n-k;i++)//i,i+k<=n
{
j=i+k;
d[i][j]=inf;
if((s[i-1]=='(' && s[j-1]==')')||(s[i-1]=='[' && s[j-1]==']'))//s下标从0开始的
{
if(d[i][j]>d[i+1][j-1])
{
d[i][j]=d[i+1][j-1];
pos[i][j]=none;//不用插入
symbol[i][j]='\0';
}
}
if(s[i-1]=='('|| s[i-1]=='[')
{
if(d[i][j]>d[i+1][j]+1)
{
d[i][j]=d[i+1][j]+1;
pos[i][j]=back;//后插
if(s[i-1]=='(')
symbol[i][j]=')';
else
symbol[i][j]=']';
}
}
if(s[j-1]==')' ||s[j-1]==']')
{
if(d[i][j]>d[i][j-1]+1)
{
d[i][j]=d[i][j-1]+1;
pos[i][j]=front;
if(s[j-1]==')')
symbol[i][j]='(';
else
symbol[i][j]='[';
}
}
for(int r=i;r<=i+k-1;r++)
{
if(d[i][j]>d[i][r]+d[r+1][i+k])
{
d[i][j]=d[i][r]+d[r+1][i+k];
pos[i][j]=r;//
}
}
}
solve(pos,1,n,s,symbol);
cout<<endl;
return 0;
}
void solve(int pos[Max+1][Max+1],int i,int j,string s,char symbol[Max+1][Max+1])
{
//注意insert函数在索引之前插入值
if(i>j)return;
if(pos[i][j]==none)
{
cout<<s[i-1];
solve(pos,i+1,j-1,s,symbol);
cout<<s[j-1];
}
if(pos[i][j]==back)
{
cout<<s[i-1];
solve(pos,i+1,j,s,symbol);
cout<<symbol[i][j];
}
if(pos[i][j]==front)
{
cout<<symbol[i][j];
solve(pos,i,j-1,s,symbol);
cout<<s[j-1];
}
if(pos[i][j]>=i && pos[i][j]<=j)
{
solve(pos,i,pos[i][j],s,symbol);
solve(pos,pos[i][j]+1,j,s,symbol);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator