这个题目让我蛋疼了一晚上,最后对比别人的代码,才发现问题:居然使用while ( scanf("%s", str) != EOF ) 导致WA!这不科学呀!
//poj_1141
#include <iostream>
using namespace std;
#define INF 10000
char str[110], result[210];
int dp[110][110], pos[110][110];
void solve( int s, int a, int b )
{
if ( a > b )
return;
if ( a == b ) {
if ( str[a] == '(' || str[a] == ')' ) {
result[s+a] = '(';
result[s+a+1] = ')';
}
else if ( str[a] == '['|| str[a] == ']' ) {
result[s+a] = '[';
result[s+a+1] = ']';
}
return;
}
int x = pos[a][b];
if ( -1 == x ) {
result[s+a] = str[a];
result[ s+dp[a][b]+b ] = str[b];
solve( s, a+1, b-1 );
return;
}
solve( s, a, x );
solve( s+dp[a][x], x+1, b );
}
int main()
{
int i, j, k, len, x, tmp;
//cin >> str;
scanf("%s", str );
//while ( scanf("%s", str) != EOF ) { //为什么这样子不可以,蛋疼,撒了一地的蛋黄
len = strlen(str);
memset( dp, 0, sizeof(dp) );
memset( pos, 0, sizeof(pos) );
for ( i = 0; i < len; ++ i ) {
dp[i][i] = 1;
}
for ( k = 2; k <= len; ++ k )
{
for ( i = 0; i <= len-k; ++ i )
{
j = i+k-1;
dp[i][j] = INF;
if ( ( '(' == str[i] && ')' == str[j] )
|| ( '[' == str[i] && ']' == str[j] ) )
{
if ( dp[i+1][j-1] < dp[i][j] )
{
dp[i][j] = dp[i+1][j-1];
pos[i][j] = -1;
}
}
for ( x = i; x < j; ++ x )
{
tmp = dp[i][x] + dp[x+1][j];
if ( tmp < dp[i][j] )
{
dp[i][j] = tmp;
pos[i][j] = x;
}
}
}
}//for ( k=2
memset( result, 0, sizeof(result) );
solve( 0, 0, len-1 );
printf("%s\n", result );
//}//while
return 0;
}