| ||||||||||
| 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 | |||||||||
为什么一个ac,而一个却超时呢?代码一:(超时)
#include<stdio.h>
#include<string.h>
int tag[110][110];//tag记录能否str[st]和str[end]中划分子问题,用opt[i][j]表示从str[st]到str[end]所需要插入的最小字符数
char str[128];
int opt[110][110];
void search(int st,int end)
{
if(st>end)
return ;
else if(st==end) //如果剩下最后一个字符,为之配对
{
if(str[st]==')'||str[st]=='(')
printf("()");
else printf("[]");
return ;
}
else if(tag[st][end]==-1)//如果str[st]和str[end]配对(tag==-1),打印str[st]和str[end],继续搜索str[st+1]和str[end-1]
{
printf("%c",str[st]);
search(st+1,end-1);
printf("%c",str[end]);
}
else if(tag[st][end]=-2)//如果str[st]和str[end]不配对(tag!=-1),搜索从tag分开的两个子问题
{
if(str[st]=='(')
printf("()");
else printf("[]");
search(st+1,end);
}
else if(tag[st][end]==-3)
{
if(str[st]==')')
printf("()");
else printf("[]");
search(st,end-1);
}
else
{search(st,tag[st][end]);
search(tag[st][end],end);
}
}
int main()
{
int i,j,k,interval,tmp,len;
gets(str);
len=strlen(str);
for(i=0;str[i]!='\0';i++)
if(str[i]==' ')
for(j=i;j<len;j++)
str[j]=str[j+1];
len=strlen(str);
for(i=1;i<110;i++) //初始化
{
tag[i][i]=1;
tag[i][i-1]=0;
}
tag[0][0]=1;
for(interval=1;interval<len;interval++) //从间隔1个字母到间隔len-1个字母分别计算tag
for(i=0;i+interval<len;i++)
{
j=i+interval;
opt[i][j]=32767;
if(str[i]=='('&&str[j]==')'||str[i]=='['&&str[j]==']')//如果str[i]和str[j]可以配对,问题转化为求str[i+1][j-1]的tag
{
if(opt[i+1][j-1]<opt[i][j])
{
tag[i][j]=-1;
opt[i][j]=opt[i+1][j-1];
}
}
for(k=i;k<=j;k++)
{
if(opt[i][j]>opt[i][k]+opt[k][j])
{
opt[i][j]=opt[i][k]+opt[k+1][j];
tag[i][j]=k;
}
}
if(opt[i+1][j]+1<opt[i][j]&&(str[i]=='('||str[i]=='['))
{
opt[i][j]=opt[i+1][j]+1;
tag[i][j]=-2;
}
if(opt[i][j-1]+1<opt[i][j]&&(str[j]==')'||str[j]==']'))
{
opt[i][j]=opt[i+1][j]+1;
tag[i][j]=-3;
}
}
search(0,len-1);
printf("\n");
return 0;
}
代码二:(0Ms)
#include <iostream>
#include <algorithm>
#include <limits>
using namespace std;
int result[101][101];
int path[101][101]= {0};
char str[101];
void output( int i, int j )
{
if ( i> j ) return;
else if ( i== j )
{
if ( str[i]== '(' || str[i]== ')' )
printf("()");
else
printf("[]");
return;
}
else if ( path[i][j]== -1 )
{
printf("%c",str[i] );
output( i+ 1, j- 1 );
printf("%c",str[j] );
}
else if ( path[i][j]== -2 )
{
if ( str[i]== '(' )
{
printf("(");
printf(")");
output( i+ 1, j );
}
else
{
printf("[");
printf("]");
output( i+ 1, j );
}
}
else if ( path[i][j]== -3 )
{
if ( str[j]== ')' )
{
printf("(");
output( i, j- 1 );
printf(")");
}
else
{
printf("[");
output( i, j- 1 );
printf("]");
}
}
else
{
output( i, path[i][j] );
output( path[i][j]+ 1, j );
}
}
int main()
{
while ( gets(str)!= NULL )
{
int len= strlen( str );
int j= 0;
for ( int i= 0; i< len; ++i )
{
if ( str[i]!= ' ' )
{
str[j]= str[i];
j++;
}
}
str[j]= '\0';
len= strlen(str);
for ( i= 1; i< len; ++i )
{
result[i][i-1]= 0;
result[i][i] = 1;
}
result[0][0]= 1;
for ( i= 1; i< len; ++i )
{
for ( int j= 0; j< len- i; ++j )
{
int t= j+ i;
result[j][t]= INT_MAX;
if ( (str[j]== '(' && str[t]== ')') || (str[j]== '[' && str[t]== ']' ) )
{
if ( result[j+1][t-1]< result[j][t] )
{
path[j][t] = -1;
result[j][t]= result[j+1][t-1];
}
}
for ( int k= j; k<= t; ++k )
if ( result[j][t]> result[j][k]+ result[k+1][t] )
{
result[j][t]= result[j][k]+ result[k+1][t];
path[j][t]= k;
}
if ( ( str[j]== '(' || str[j]== '[' ) &&
( result[j+1][t]+ 1< result[j][t] ) )
{
result[j][t]= result[j+1][t]+ 1;
path[j][t] = -2;
}
if ( ( str[t]== ')' || str[t]== ']' ) &&
( result[j][t-1]+ 1< result[j][t] ) )
{
result[j][t]= result[j][t-1]+ 1;
path[j][t]= -3;
}
}
}
output( 0, len- 1 );
printf("\n");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator