《算法竞赛进阶指南》 区间DP 金字塔
一段dfs序列可看作一颗子树,那么区间DP中的字树合并可以看作两颗字树的合并。两颗子树合并:以其中左边子树的根为根,右边子树作为左边子树的最右边一颗子树。
int f[302][302] = {0};
void solve()
{
cin >> str;
int n = str.size();
str = "0" + str;
for (int i = 1; i <= n; i++)
{
f[i][i] = 1;
}
for (int len = 3; len <= n; len += 2)
{
for (int i = 1; i <= n; i++)
{
int r = i + len - 1;
if (r > n)
{
break;
}
if (str[i] != str[r])
{
continue;
}
for (int k = i; k <= r - 2; k += 2)
{
f[i][r] += f[i][k] * f[k + 1][r - 1];
f[i][r] %= MOD;
}
}
}
cout << f[1][n] << endl;
}
收获:
1.一段dfs序列可看作一颗子树
2.如何将两颗子树合并:以其中左边子树的根为根,右边子树作为左边子树的最右边一颗子树。

浙公网安备 33010602011771号