線性DP 路面修整

2021-08-29 20:56:21 字數 1975 閱讀 7612

fj打算好好修一下農場中某條凹凸不平的土路。按奶牛們的要求,修好後的 路面高度應當單調上公升或單調下降,也就是說,高度上公升與高度下降的路段不能

同時出現在修好的路中。

整條路被分成了n段,n個整數a1,…,an(1<=n<=2,000)依次描述

了每一段路的高度(0<=ai<=1,000,000,000)。fj希望找到乙個恰好含n個

元素的不上公升或不下降序列b1,…,bn,作為修過的路中每個路段的高度。

由於將每一段路墊高或挖低乙個單位的花費相同,修路的總支出可以表示為:|a1−b1|+|a2−b2|+…+|an−bn|請你計算一下,fj在這項工程上的最小支出是多少。fj向你保證,這個支出

不會超過maxint。

輸入

第1行: 輸入1個整數:n

第2…n+1行: 第i+1行為1個整數:a_i

輸出第1行: 輸出1個正整數,表示fj把路修成高度不上公升或高度不下降的最小花費

樣例輸入 [複製]71

3245

39樣例輸出3提示

輸出說明:

fj將第乙個高度為3的路段的高度減少為2,將第二個高度為3的路段的高度 增加到5,總花費為|2-3|+|5-3| = 3,並且各路段的高度為乙個不下降序列 1,2,2,4,5,5,9。

標籤usaco2008feb-gold

分析:基礎的線性dp,首先乙個合法的方案一定可以滿足構造出的序列b使得

∀ x∈

b∀x∈b

∀x∈b

有x ∈a

x∈ax∈

a,所以b序列一定是由多個x(x∈a)的連續段構成的,那麼先將a離散化降低消耗,設f[i

][j]

f[i][j]

f[i][j

]為做完前i個數,最後乙個數為j的最小花費,則有:

f [i

][j]

=min

(f[i

−1][

k]+∣

a[i]

−j∣)

f[i][j]=min(f[i-1][k]+|a[i]-j|)

f[i][j

]=mi

n(f[

i−1]

[k]+

∣a[i

]−j∣

),即可o(n

2)

o(n^2)

o(n2)dp

**:

#include

using

namespace std;

const

int size=

2010

;int a[size]

,c[size]

,nums[size]

;int f[size]

[size]

;int n;

intmain()

sort

(nums+

1,nums+n+1)

;int m=

unique

(nums+

1,nums+n+1)

-nums-1;

for(

int i=

1;i<=n;i++

) c[i]

=lower_bound

(nums+

1,nums+m+

1,a[i]

)-nums;

memset

(f,0x3f

,sizeof

(f))

; f[0]

[0]=

0;for(

int i=

1;i<=n;i++)}

int ans=

1<<30;

for(

int i=

1;i<=m;i++

) ans=

min(ans,f[n]

[i])

; cout<}

NOIP模擬賽 路面修整

題目描述 fj打算好好修一下農場中某條凹凸不平的土路。按奶牛們的要求,修好後的路面高度應當單調上公升或單調下降,也就是說,高度上公升與高度下降的路段不能同時出現在修好的路中。整條路被分成了n段,n個整數a 1,a n 1 n 2,000 依次描述了每一段路的高度 0 a i 1,000,000,00...

21th 動態規劃 路面修整

fj打算好好修一下農場中某條凹凸不平的土路。按奶牛們的要求,修好後的路面高度應當上公升或下降,也就是說,高度上公升與高度下降的路不能同時出現在修好的路中。整條路被分成了n段,n個整數a 1,a n 依次描述了每一段路的高度。fj希望找到乙個恰好含n個元素的不上公升或不下降序列b 1,b n,作為修過...

線性dp 區間dp

1 尼克的任務 額一道挺水的題,愣是做了幾個小時 動態規劃大致的思路還是找乙個轉移 換個詞就是影響 我們可以明顯看出本題的規則 空暇時,一遇到任務必須挑乙個接 求1 n時間內最大空暇時間 所以將任務排序是必要的,兩個關鍵字 再來想象一下當我做到第i 個任務時,我在 st i st i t i 1 時...