| Time Limit: 1000MS | Memory Limit: 65536K | |||
| Total Submissions: 26407 | Accepted: 7443 | Special Judge | ||
Description
Input
Output
Sample Input
([(]
Sample Output
()[()]
Source
#include <cstdio>
#include <cstring>
int const INF = 0xfffffff;
int const MAX = 105;
int dp[MAX][MAX], path[MAX][MAX];
char s[MAX];
void Print(int i, int j)
{
if(i > j) //无效位置
return;
if(i == j) //遇单个字符输出匹配后的结果
{
if(s[i] == '(' || s[i] == ')')
printf("()");
else
printf("[]");
}
else if(path[i][j] == -1) //若i到j已经匹配,输出左边,递归中间再输出右边
{
printf("%c", s[i]);
Print(i + 1, j - 1);
printf("%c", s[j]);
}
else //否则,递归输出分割点两边
{
Print(i, path[i][j]);
Print(path[i][j] + 1, j);
}
}
int main()
{
while(gets(s))
{
int n = strlen(s);
if(n == 0)
{
printf("\n");
continue;
}
memset(dp, 0, sizeof(dp));
for(int i = 0; i < n; i++)
dp[i][i] = 1;
for(int l = 1; l < n; l++)
{
for(int i = 0; i < n - l; i++)
{
int j = i + l;
dp[i][j] = INF;
if((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']'))
{
dp[i][j] = dp[i + 1][j - 1];
path[i][j] = -1;
}
for(int k = i; k < j; k++)
{
if(dp[i][j] > dp[i][k] + dp[k + 1][j])
{
dp[i][j] = dp[i][k] + dp[k + 1][j];
path[i][j] = k;
}
}
}
}
Print(0, n - 1);
printf("\n");
}
}POJ 1141 Brackets Sequence (线性dp 括号匹配 经典题)
原文地址:http://blog.csdn.net/tc_to_top/article/details/43834921