dp 優化入門

2022-10-06 22:48:19 字數 2578 閱讀 3358

蒟蒻學了這個忘了那個,學了那個忘了這個,於是開篇部落格總結一下 qwq

不過等我 github 部落格弄好了就不會在這裡更新了

題目描述:\(n\) 個玩具,第 \(i\) 個玩具長度為 \(c_i\),要求將玩具分成若干段,定義一段 \([l,r]\) 的權值 \(l\) 為 \(r-l + \sum_^rc_k\)。一段長為 \(x\) 的段的費用為 \((x-l)^2\),其中 \(l\) 為給定的乙個常數,要求最小化分段後的費用。

考慮設計暴力 \(\texttt\) : \(f_i\) 表示以 \(i\) 結尾,分成若干段得到的最小總費用。

設立 \(s_k\) 表示 \(\sum_^k c_i\)

\[f_i=\min_^f_j+(i-j + s_i - s_ - l)^2

\]這是暴力的平方方程,我們考慮將所有 \(c_i\) 都在一開始減去 \(1\),那麼就可以省略掉 \(i-j\),變為:

\[f_i=\min_^f_j+\ - (l + 1)\}^2

\]再讓 \(l + 1\),變為:

\[f_i=\min_^f_j+( s_i - s_ - l)^2

\]好看多了,暴力拆開平方項。

\[f_i=\min_^\^2-2s_is_+l^2-2ls_i+2ls_\}

\]先去掉 \(\min\),然後考慮兩個決策點 \(j_1,j_2\) 如果 \(j_2\) 比 \(j_1\) 更優,那麼需要滿足什麼條件。

\[f_i= f_j+ s_i^2+s_^2-2s_is_+l^2-2ls_i+2ls_

\]也就是什麼時候:

\[f_+ s_i^2+s_^2-2s_is_+l^2-2ls_i+2ls_

考慮消去同類項,剩下的只有:

\[f_+s_^2-2s_is_+2ls_

考慮進行參變數分離,讓一邊只有 \(i\) 這種定項,另一邊則是不定項,那麼得到的答案是:

\[2s_i(s_})

然後除過去:

\[2s_i

\]令 \(x(j) = s_\), \(y(j) = f_+s_^2+2ls_\) ,寫成代數關係抽象。

那麼原式子化為 \(2s_i

這就是從代數的層面上理解的斜率優化。

還有些內容先咕咕一下。

剛剛把這東西弄懂,可能需要記錄一下。

考慮這麼乙個問題:

將乙個長為 \(n\) 非負整數序列分為 \(k\) 段,每段權值為段內元素和的平方,要求最小化權值。

首先,如果沒有 \(k\) 段限制,最終整個序列一定會被劃分為 \(n\) 段,因為都為非負整數,兩個非負整數 \(a,b\) 滿足 \((a+b)^2>a^2+b^2\) 。

但是有了這個之後,我們就只會寫乙個 \(o(nk)\) 的暴力了。

然後神仙 wqs 就整理出了這麼乙個二分方法 %%%%%

考慮 \(f_\) 表示前 \(i\) 個數分成 \(j\) 段的最小權值。

然後令 \(f_i\) 表示 \(f_\)。

通過一開始的結論,你發現 \(f_i\) 一定是一段凸函式,類似下面這種。

在這個題中,這是乙個下凸函式,也就是斜率單調不增。

其中的 \(x\) 表示的是分段數量,然後 \(y\) 表示的是對應取到的值。

我們發現,如果我們現在有乙個斜率為 \(k\) 的直線,那麼拿這個直線去和這個凸包相切的話,我們會得到乙個點 \((p,f_p)\) 。

這個點就是在斜率為 \(k\) 的情況下,所有點中,縱截距最小的那個。(因為這裡是下凸包,如果是上凸包就是最大的)

也就是在所有點 \((i,f_i)\) 中,使得 \(f_i - ki\) 最小的那個點 \(p\)。

那就考慮列出這個截距的函式,你不難發現這個截距也是乙個下凸函式。

乙個下凸函式加上乙個一次函式後,仍然會是乙個下凸函式。

證明比較顯然(),考慮如果加入的一次函式斜率 \(<0\) 那麼理所應當,如果 \(>0\) ,那麼就是左小右大,這個時候函式斜率變成了負的,所以還是在變小。

那麼接下來的問題是我們如何在確定 \(k\) 的時候求出 \(p\) 和對應的 \(f_p\)。根據他的截距最小,本問題可以化歸為:

每個物品的代價減去 \(k\),本題也就是每次選一段就將答案減去 \(k\)。

然後求出在不限段數的情況下,答案的最小值 \(g\) 以及取到最小值時的段數 \(p\) ,那麼求出 \(f_p= g+pk\) ,本題用乙個斜率優化 dp 就搞完了。

這樣為啥可以呢(),感覺很感性,就是你思考你給每段賦值了乙個額外權值,我們現在要最小化權值,當額外權值大的時候,你就會盡可能分少段,當額外權值小的時候,你就會可能會分多段。

假設取得最小值的時候為 \(m\),如果這個時候 \(p=m\) 那就已經取到了最小值。

如果 \(p < m\) 那麼說明我們的斜率還不夠小,如果 \(p>m\) 的時候說明我們的斜率還不夠大,如果是上凸包就會改變大小關係。

但是注意乙個很坑人的地方,,,

我們其實有可能找不到這個 \(m\) ,就是如果有三點共線了。

那麼我中間的點就不會被取到了

也可以解決,可以由他左邊這個點

然後這就是 wqs 二分的全過程 qwq,感覺確實很強,不過上面的理性證明我也不是很會,不過大概能悟道是這麼個理。

MySQL優化入門

表 符合三正規化 nf 一正規化 表的列具有原子性 不可再分割 列的資訊不能分割 關係型資料庫自動滿足一正規化 二正規化 表中的記錄是唯一的 設定主鍵,不含業務邏輯,資料穩定,不用修改 三正規化 表中不要有冗餘資料 表的資訊如果能被推導出來 就不應該單獨設計乙個字段 設計者有時候為了方便 多設計字段...

ORACLE SQL優化 入門

聽了王海波老師的課後的筆記 1.sql優化需要什麼?select from t1 where t1.x 2.為什麼建索引可以優化 建立索引以後,oracle就有兩個選擇,當選擇了更優秀的路徑去執行,這個過程就叫做優化。3.什麼是訪問路徑 訪問路徑是用於從行源檢索行的一種技術 1 table acce...

簡單暴力到dp的優化(入門篇)

上篇,我們提到,遇到問題,首先根據定義寫出笨方法,找出依賴關係 有些題這一步就不太簡單,要自己歸納關係 然後進行優化,下面,我們通過幾道此方面的經典的,較為簡單的二維題目進行講解。開始根據題來說明 給定陣列arr,arr 中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任...