DP基础题
#include<iostream>
using namespace std;
char str[110];
int dp[110][110],path[110][110];
void output(int i,int j)
{
if(i > j) return ;
if(i == j)
{
if(str[i] == '['||str[i] == ']')
printf("[]");
else
printf("()");
}
else if(path[i][j] == -1)
{
printf("%c",str[i]);
output(i+1,j-1);
printf("%c",str[j]);
}
else
{
output(i,path[i][j]);
output(path[i][j]+1,j);
}
}
int main()
{
while(gets(str))
{
int len = strlen(str);
if(len == 0)
{
printf("\n");
continue;
}
int i,j,k,r;
memset(dp,0,sizeof(dp));
for(i = 0;i < len;i++)
dp[i][i] = 1;
for(k = 1;k <= len-1;k++)
for(i = 0;i+k < len;i++)
{
j = i+k;
dp[i][j] = INT_MAX;
if((str[i] == '('&&str[j] == ')')||(str[i] == '['&&str[j] == ']'))
if(dp[i][j] > dp[i+1][j-1])
dp[i][j] = dp[i+1][j-1],path[i][j] = -1;
for(r = i;r <= j-1;r++)
if(dp[i][j] > dp[i][r]+dp[r+1][j])
dp[i][j] = dp[i][r]+dp[r+1][j],path[i][j] = r;
}
output(0,len-1);
printf("\n");
}
return 0;
}