//https://vjudge.net/problem/POJ-1141#author=Prince1Alexander
const int N = 1e3 + 10;
int dp[N][N];
string path[N][N];
void solve()
{
string s;
cin >> s;
int n = s.size();
s = '?' + s;
for(int i = 1; i <= n; i++)
{
dp[i][i] = 1;
if(s[i] == '(' || s[i] == ')') path[i][i] = "()";
else path[i][i] = "[]";
}
for(int l = 1; l <= n; l++)
for(int r = l + 1; r <= n; r++)
dp[l][r] = inf;
for(int len = 2; len <= n; len++)
{
for(int l = 1; l + len - 1 <= n; l++)
{
int r = l + len - 1;
for(int mid = l; mid < r; mid++)
{
if(dp[l][mid] + dp[mid + 1][r] < dp[l][r])
{
dp[l][r] = dp[l][mid] + dp[mid + 1][r];
path[l][r] = path[l][mid] + path[mid + 1][r];
}
}
if((s[l] == '(' && s[r] == ')' || s[l] == '[' && s[r] == ']') && dp[l + 1][r - 1] < dp[l][r])
{
dp[l][r] = dp[l + 1][r - 1];
path[l][r] = s[l] + path[l + 1][r - 1] + s[r];
}
// cout << l << ' ' << r << ' ' << path[l][r] << '\n';
}
}
cout << path[1][n] << '\n';
}
区间DP路径记录问题(常常开一个和dp数组等大的路径数组)
最新推荐文章于 2024-11-04 19:24:37 发布
该代码实现了一个动态规划算法,用于解决字符串中有效括号的匹配问题。通过维护一个二维dp数组和路径矩阵,计算从字符串的某个位置到另一个位置的最小匹配括号组合。遍历字符串的不同长度子串,更新dp值和路径信息。最后输出从第一个字符到最后一个字符的最优括号路径。
摘要由CSDN通过智能技术生成