pku 1141 Bracket Sequence DP 解题报告
以前做过的十分典型DP.黑书有这题的思路.关键是明白是最优子结构。
#include <string>
#include <iostream>
using namespace std;
#define min(a, b) a > b ? b : a
int len;
int d[110][110];
char s[110], result[110];
string ans[110][110];
int main()
{
int i, j, k, p, len;
scanf("%s", s + 1);
len = strlen(s + 1);
for (i = 1; i <= len; i++)
{
d[i][i] = 1;
if (s[i] == '(')
{
ans[i][i] = "()";
}
else if (s[i] == ')')
{
ans[i][i] = "()";
}
else if (s[i] == '[')
{
ans[i][i] = "[]";
}
else if (s[i] == ']')
{
ans[i][i] = "[]";
}
}
//d[i,j]表示从位置i到位置j所需要插入的最小字符数
//ans[i,j]则存储最优字符串内容
for (p = 1; p <= len - 1; p++)
{
for (i = 1; i <= len - p; i++)
{
j = i + p;
d[i][j] = 110;
if (s[i] == '(' && s[j] == ')')
{
if (d[i + 1][j - 1] < d[i][j])
{
d[i][j] = d[i + 1][j - 1];
ans[i][j] = '(' + ans[i + 1][j - 1] + ')';
}
}
else if (s[i] == '[' && s[j] == ']')
{
if (d[i + 1][j - 1] < d[i][j])
{
d[i][j] = d[i + 1][j - 1];
ans[i][j] = '[' + ans[i + 1][j - 1] + ']';
}
}
for (k = i; k <= j - 1; k++)
{
if (d[i][k] + d[k + 1][j] < d[i][j])
{
//最优子结构:d[i][j]=min(d[i][j], d[i][k]+d[k+1][j])
d[i][j] = d[i][k] + d[k + 1][j];
ans[i][j] = ans[i][k] + ans[k + 1][j];
}
}
}
}
cout << ans[1][len] << endl;
return 0;
}