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 時...