Dp優化 斜率優化

要求

該模板的ai要具有單調性,也就是sum數組(若沒有單調性,加個二分即可)

例題+思路

我的一篇題解,很詳細
https://blog.csdn.net/WHY995987477/article/details/104026232

從使用的角度

1、寫出狀態轉移方程
2、按照斜率優化的式子推導出式子
3、代入模板即可。

模板

#include <cstdio>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int maxn = 5e5 + 10;
ll a[maxn];
ll sum[maxn];
ll dp[maxn];
ll que[maxn];
ll get_up(int u, int v)///Y
{
    return (dp[u] + sum[u] * sum[u]) - (dp[v] + sum[v] * sum[v]);///視情況修改
}
ll get_down(int u, int v)///x
{
    return 2 * (sum[u] - sum[v]);///視情況修改
}
int main()
{
    ll n, m;
    while(scanf("%lld %lld", &n, &m) != EOF)
    {
        for(int i = 1; i <= n; i++)
        {
            scanf("%lld", &a[i]);
            sum[i] = sum[i - 1] + a[i];
        }
        int L = 1, R = 1;
        for(int i = 1; i <= n; i++)
        {
            while(L < R && 如果斜率小於右側ai,那麼向右移動)//前提是ai滿足單調性
                L++;
            dp[i] = 狀態轉移公式;            //求出dp的值
            while(L < R && 如果i與R的斜率 小於 R與R-1的斜率)	            //維護下凸性
                R--;
            que[++R] = i;
        }
        printf("%lld\n", dp[n]);
    }
    return 0;
}

參考來源

一篇寫的很詳細很好的博客
https://www.cnblogs.com/yangsongyi/p/9630227.html

發佈了184 篇原創文章 · 獲贊 24 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章