決策單調性優化DP 分治優化決策單調性

2022-05-07 21:45:11 字數 2574 閱讀 9897

前言

本來這篇已經寫了\(\frac\)了 然後我關機時忘儲存了。。。

華麗的分割線

對於類似於

\[dp[i][j]=max/min(dp[k - 1][j - 1] + count(k,i))

\]不妨設 當 最後一次 \(max/min\)更新時

\[f(i,j)=k

\]若有

\[\forall i,j\in[1,n],s.t. i < j \rightarrow f(i,k)<=f(j,k)

\]我就可以稱她具有決策單調性

例題[hnoi2008]玩具裝箱toy

題意我就不概括了

據題 容易推出狀態方程

\[dp[i]=min(dp[j-1]+count(i,j))

\]憑感覺 是具有決策單調性的

其實可以證明

不過我太菜了 不會

既然決策具有單調性

那麼對於每乙個決策點 我們可以拿出乙個決策區間

用乙個雙端佇列維護 決策點 和 決策區間

在每一次迴圈前

把區間\(.r的捨去

然後再以當前點為決策點看是否能比佇列中的對後面的貢獻更小

while(l <= r&&dp[i] + count(q[r].l,i) <= dp[q[r].pos] + count(q[r].l,q[r].pos)) r--;
注意\(while\)結束後還要特判一下

\[dp[i] + count(q[r].l,i) <= dp[q[r].pos] + count(q[r].l,q[r].pos)

\]不見得

\(\forall x \in[q[r].l,q[r].r]\rightarrow dp[i] + count(x,i) > dp[q[r].pos] + count(x,q[r].pos)\)

所以還要二分找一下那個特殊的位置

因為決策點具有單調性\(\rightarrow\)決策區間具有單調性\(\rightarrow\)維護的雙端佇列具有單調性

與單調佇列類似 每點只進入和刪除一次

但是有二分

時間複雜度\(o(nlogn)\)

\(code\)

#include #include #include #include #include using namespace std;

#define reg register int

#define isdigit(x) ('0' <= x&&x <= '9')

templateinline t read(t type)

while(isdigit(a))

return x * f;

}typedef long long ll;

const int maxn = 50010;

int n,l,a[maxn];

ll dp[maxn],sum[maxn];

struct node

}q[maxn];

inline ll co(ll x)

inline ll count(int i,int j)

inline int get_(int x,node seq)

else l = mid + 1;

} return l;

}int main()

printf("%lld\n",dp[n]);

return 0;

}

這類\(dp\) 通常還能再優化

也許是用斜率 或單調佇列

但是決策單調性的好想,好實現及其優於暴力的特點讓我們常常使用

因為 決策具有單調性

那麼就可以使用分治優化

cf321e ciel and gondolas

#include #include #include #include using namespace std;

#define reg register int

#define isdigit(x) ('0' <= x&&x <= '9')

templateinline t read(t type)

while(isdigit(a))

return x * f;

}const int maxn = 4010,inf = 1000000000;

int sum[maxn][maxn],dp[maxn][810];

inline int count(int i,int j)

inline void dfs(int k,int l,int r,int opl,int opr)

dp[mid][k] = minl;

dfs(k,l,mid - 1,opl,id);

dfs(k,mid + 1,r,id,opr);

}int main()

for(reg i = 1;i <= n;i++) dp[i][0] = inf;

for(reg i = 1;i <= k;i++) dfs(i,1,n,1,n);

printf("%d",dp[n][k] / 2);

return 0;

}

決策單調性優化 dp 合集

p1912 noi2009 詩人小g 後面的決策能反超前面的,二分決策佇列。p3515 poi2011 lightning conductor 不是決策單調性,但可以維護決策的棧。後面的決策可能被前面的反超。cf321e ciel and gondolas 決策單調性在層之間轉移,可以分治 或者利用...

決策單調性優化DP學習筆記

廢話,當然是在dp式子滿足某些性質的時候來優化複雜度 對於 j 往大於 j 的 i 轉移,可以表示成乙個關於 i 的函式 f j i 也就是 dp i max min 若是取 max 並且在某乙個地方 f j i 從下面跑到了 f k i 的上面 如果加入 f j i 這個函式時本來就在 f k i...

決策單調性優化dp 專題練習

對於形如 dp i dp j i j i j 型別的轉移方程,維護乙個上凸包或者下凸包,找到切點快速求解 技法 1.單調佇列 在保證插入和查詢的x座標均具有單調性時可以使用 2.單調棧 二分 保證插入有單調性,不保證查詢有單調性 3.分治 1 或 2 在每次分治時將 l,mid 這段區間排序後插入,...