hdu3507 動態規劃 斜率優化

2021-06-19 06:11:25 字數 1551 閱讀 7321

解題報告題目:

題目大意

:將序列

c[n]

分成若干段,每段的值為(

∑c[i])^2 + m. 求序列的最小值。

演算法 :動態規劃 + 斜率優化

思路 :看到題目以為數字和亂序,就沒想是動歸而是數論。。。。。。

因為所求的值與段數無關,因此設定dp方程時,不需要為段數設定狀態。

設 dp[i]表示前i段的最小值

則有 dp[i] = min (0 < j < i)

明顯是n^2的演算法,n = 500000是解決不了的,分析表示式: è

dp[i] = min è

令 cost[j] = (dp[j] + sum[i] – sum[j]) ^2 + m

è 對於 任意j,k

, 分析當cost[k] > cost[j] 時會有什麼規律(此時dp[i] = cost[j]) è

cost[k] >= cost[j] è

(dp[k] + sum[i] – sum[k]) ^2 + m >=

(dp[j] + sum[i] – sum[j]) ^2 + m è

dp[k] + sum[k]^2 – (dp[j] – sum[j]^2) >= 2*sum[i] *(sum[k] – sum[j]) è

將sum看作還是點,dp – sum^2看作函式值,則上式便是斜率表示式 è

dp[k] + sum[k]^2 – (dp[j] – sum[j]^2) / (sum[k] – sum[j]) >= 2*sum[i] è

對於前i-1維護乙個下凸曲線,我們要的是與2×sum[i]相切的那個點即(k(t-1,t) <= 2*sum[i]並且k(t,t + 1) > 2 * sum[i])

è 利用下凸曲線斜率的單調性,只需維護乙個指標向後掃瞄下凸曲線上節點,時間複雜度o(n)

其實斜率優化就是利用凸包單調性優化遞推方程遞推項的過程。

提交情況

:wrong answer 5

次(維護下凸曲線是沒有單調遞增,但是目前還沒發現錯誤用例)

accepted 1次

經驗與收穫

:學習了

dp的第乙個斜率優化,還需多做題來體會

ac code:

#include

#define

maxn 500100

typedef

__int64 i64;

intstrack[maxn], top;

i64 m, dp[maxn], sum[maxn];

intturn_right(int p, int q, int r)

intmain()

t = top = 0;

strack[top] = dp[0] = 0;

strack[++top] = 1;

dp[1] = sum[1] * sum[1] + m;

for(i = 2; i <= n; i ++)

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

} return 0; }

HDU3507 斜率優化

r 題意 把n分成任意段 每段中連續 每一段代價 ci m 求總的最小代價 i l作為提醒自己的經驗題,即使再水也要記住坑點 其實是自己被坑的地方 斜率優化裸題 首先定義dp i 表示把前i個處理好的最小代價 dp i min 一看這個轉移就是n 2的,我們來搞成o n 的。h i m sum i ...

hdu 3507 斜率優化

我的第一道斜率優化。就這道題而言,寫出原始的方程 dp i min o n 2 的複雜度肯定超時,要麼優化轉移,要麼重寫方程。斜率優化的思想就是減少不必要的列舉 即不列舉肯定不會成為決策點的j 我們考慮兩個位置p 選擇q比選擇p優 當且僅當 dp q sum i sum q 2 m dp p sum...

hdu3507斜率優化dp

這題 n可能取500000,o n 2 就會超時吧,所有只能優化。注意到這題的動態規劃方程 dp i max dp j sum i sum j 2 m 化簡下得 dp i max dp j sum i 2 sum j 2 2 sum i sum j 無法直接用單調佇列優化,i和j不能分開。假設j比k...