《算法进阶指南》--四边形不等式优化--再探石子合并

二维四边形不等式优化常见与区间dp优化,对于形如f[i][j]=min(f[i][k] + f[k+1][j] + val(i,j)); 若val(i,j)满足四边形不等式,则f[i][j]同样满足四边形不等式。并由此可以得出结论:设p(i,j)表示f[i][j]的最优决策,P(i,j-1)<=p(i,j)<=p(i+1,j) ,所有f[i][j]最优决策位于(P(i,j-1),p(i+1,j)),区间dp中p(i,j-1)与p(i+1,j)区间长度小于p(i,j)会在上一个阶段求出,遍历(p(i,j-1),p(i+1,j))得出p(i,j)。

int n;
int arr[5003];
int prearr[5003];
int f[5003][5003];
int p[5003][5003];
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> arr[i];
        prearr[i] = prearr[i - 1] + arr[i];
    }

    for (int i = 1; i < n; i++)
    {
        f[i][i + 1] = arr[i] + arr[i + 1];
        p[i][i + 1] = i;
    }

    for (int len = 3; len <= n; len++)
    {
        for (int i = 1; i + len - 1 <= n; i++)
        {
            int j = i + len - 1;
            int l = p[i][j - 1], r = p[i + 1][j];
            int minn = INF;
            int minp = l;
            for (int nowp = l; nowp <= r; nowp++)
            {
                if (f[i][nowp] + f[nowp + 1][j] + prearr[j] - prearr[i - 1] < minn)
                {
                    minn = f[i][nowp] + f[nowp + 1][j] + prearr[j] - prearr[i - 1];
                    minp = nowp;
                }
            }
            p[i][j] = minp;
            f[i][j] = minn;
        }
    }
    cout << f[1][n] << endl;
}

收获:

posted @ 2025-07-11 21:35  青一凡  阅读(4)  评论(0)    收藏  举报