前言
本來這篇已經寫了\(\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 這段區間排序後插入,...