寫了一道單調性優化發現 跟斜率優化很像,而且這道題目感覺質量非常的好。
其實斜率優化是基於單調性優化的,但是面對這道題 我竟然連單調性優化都不太會,儘管這個模型非常不好理解。
對於每道題 我都會打乙個暴力 程式一般可得40分左右考試的時候我想時間夠的話可以對拍(儘管現在不太會了)。
dp 考慮 f[i]表示第i個數字的最小的p值
f[i]=max(f[i],a[j]-a[i]+sprt(abs(i-j))(向上))其中 j∈[1,n];
將其優化的話第一要先去掉絕對值然後形成兩個dp式子
f[i]=max(1<=j發現i j緊緊的連在一起根本不是斜率優化的模型 看完一篇超級不錯的題解之後發現是具有單調性的
f[i]=max-a[i]; 想個辦法使得a[j]+sqrt(i-j)最大
發現是單調性優化 get! sqrt(n)的增長速度隨n的增大而減小
因為設 j如果 a[j]+sqrt(i-j)>a[k]+sqrt(i-k)那麼在某一時刻k會比j優秀 決策就擁有了單調性 單調遞增
開乙個三元組(p,l,r) p在l 到 r這個區間之中可以取到最優值開心的dp了
這道題目就是比較難一類的 斜率優化需要轉換一下問題 至於問題的轉換我是看書的因為沒想到貪心當時腦子有點亂
看完書上巧妙的轉換了問題之後 明白了這竟然是一道比較簡單的斜率優化問題! 2a了(第一次寫的是bf)
f[i][j]表示第i個飼養員接走前j個小貓所花費的最小時間
f[i][j]=min(f[i-1][j],f[i-1][k]+t[j]*(j-k)-(s[j]-s[k]));
t陣列是 每個接小貓的花費的最小時間 s[k]是字首和 t[i]=t1[i]-d[i];
然後f[i][j]=min(f[i-1][j],f[i-1][k]+t[j]*(j-k)-(s[j]-s[k]));(1<=k<=j)
此時我處理的是k+1~j的範圍內的東西
f[i][j]=min;
f[i][j]=min(f[i-1][k]-t[j]*k+s[k]}+t[j]*j-s[j];
f[i][j]=min(f[i-1][k]+s[k]-t[j]*k};
f[i-1][k]+s[k]=f[i][j]+t[j]*k;
以k為橫座標t[j]為斜率 斜率為定值 我只需讓截距f[i][j]最小即可
那麼現在t[j]是單調遞增的那麼維護乙個下凸殼就可以...嘿嘿嘿
這麼簡單的斜率優化問題。成功ac
constview codeint maxn=100002
;int
n,m,p;
ll d[maxn],t[maxn],s[maxn];
ll min(ll x,ll y)
ll f[
102][maxn],l,r,q[maxn];
ldb k(ll w,ll x,ll y)
intmain()
//for(int i=1;i<=m;i++)cout
//for(int i=1;i<=m;i++)cout
];
//for(int i=1;i<=m;i++)cout
for(int i=2;i<=p;i++)
}put(f[p][m]);
return0;
}
決策單調性優化DP 分治優化決策單調性
前言 本來這篇已經寫了 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 j min w i,j 其中l i,j k j,l i,j l i,j 1 如果兩個決策k1,k2滿足f i 1 k1 f i 1 k2 且k1 k2,那麼k1出現後k2就沒用了。維護乙個佇列,按k從小到大存下所有有用的決策,f i 1 k 是單調上公升的。每次加入新決策...
決策單調性優化,玄學 「for me「
例子 ans i max a j sqrt i j j i 大致意思 i位置的答案等於從i前面選乙個j位置,使得表示式最大。那麼,當咱們已經求出 i 的最大值就是在 j 位置的時候,求比 i 大的位置的答案的時候它的範圍應該是怎樣的呢?假設 a j sqrt i j a k sqrt i k j k...