DIV 2 1000
给定一个字符串([{}])()[]{} 这有这样六种括号,求至少改变多少个括号可以使其变成规则匹配的?
一个经典的DP,O(n^2)的状态空间, 就是字串的数目,然后O(n)的转移方程类似于矩阵乘法。转移方程一定要想清楚
int dp[55][55];
int cost(char a, char b)
{
if(a == '(' && b==')'|| a=='{' && b=='}'|| a=='[' && b==']') return 0;
else if(a=='(' || a == '[' || a=='{' || b==')'|| b=='}'|| b==']') return 1;
else return 2;
}
class CorrectingParenthesization
{
public:
int getMinErrors(string s)
{
memset(dp, 0 ,sizeof(dp));
int M = s.size();
for(int i=1; i<M; i++) // internal
{
if(i%2==0) continue;
for(int j=0; j<M;j++)
{
dp[j][j+i] = dp[j+1][j+i-1] + cost(s[j], s[j+i]);
for(int k=1; k<i; k++ )
{
if(k%2==0) continue;
dp[j][j+i] = min(dp[j][j+i], dp[j][j+k]+dp[j+k+1][i+j]);
}
}
}
return dp[0][M-1];
}
};