《算法竞赛进阶指南》 区间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号
浙公网安备 33010602011771号