HDU 1421 搬寢室 動態規劃

2021-07-15 13:30:47 字數 1226 閱讀 3050

description

胡老師馬上要搬新家了,可是搬家真的是乙個很累的活,看著家裡的n件物品, 胡老師已經凌亂了,因為物品實在太多。於是胡老師想了又想,決定先隨便搬2* p件過去就行了。

現在,胡老師發現每搬一次的疲勞度是和左右手的物品的重量差的平方成正比,( 每次左手一件右手一件) ,如果胡老師左手拿重量為3的物品, 右手拿重量為6的物品, 則他搬完這次的疲勞度為(6-3)^2 = 9.

現在,胡老師很有憂傷,他不知道搬完這2p件物品以後的最低勞累度是多少,你作為他聰明的學生,來幫助他解決這個問題吧。

input

有多組輸入資料。

每組輸入資料報含兩行, 第一行是兩個整數n和k(2<=2*p<=n<2000) 。n表示物品的總數,2*p表示現在要搬的物品數量(注意每次左右手各拿乙個物品)。接下裡第二行有n個正整數,分別每件物品的重量( 重量小於40000)。

output

對於每組資料, 輸出一行乙個整數,表示他搬完這2p件物品以後最低的勞累度。

sample input

2 1

1 3 

sample output4

題意:

有n件物品,要你從裡面選p(p*2解題思路:

考慮n個物品a>b>c>d>.....,最好的選法是ab一組,cd一組,ef一組...(可證)。先對n個物品排序,現在設dp[i][j]為從前j個物品裡選i對出來,那麼對於第j個物品,有兩種選擇,選或不選,即dp[i][j-1]或dp[i-1][j-2]+(a[j]-a[j-1])^2(由上面的推論知,盡量選擇與之相鄰的乙個物品使其配對),dp[i][j]初始化為inf,表示無法到達,然後對於dp[0][j],不需要選任何物品,所以為0。

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const double eps=1e-7;

const int mod=1000007;

const int maxn=2005;

int dp[maxn][maxn];

int a[maxn];

int main()

cout<}

}

動態規劃 hdu 1421 搬寢室

problem description 搬寢室是很累的,xhd深有體會.時間追述2006年7月9號,那天xhd迫於無奈要從27號樓搬到3號樓,因為10號要封樓了.看著寢室裡的n件物品,xhd開始發呆,因為n是乙個小於2000的整數,實在是太多了,於是xhd決定隨便搬2 k件過去就行了.但還是會很累,...

HDU1421 搬寢室 動態規劃

動態規劃題 題意是輸入兩個整數n和k,表示從n件物品中搬走k對 每次左右手各搬一件 已知每件物品的疲勞值,求搬走k對後的最小疲勞度。每個物品的疲勞度用ans存起來,很明顯,把ans按公升序排序後每相鄰兩個物品的疲勞度都是最小的 然後定義陣列dp i j 表示從前i件物品中搬走j對的總疲勞度,則對於第...

(動態規劃)HDU1421搬寢室

problem description 搬寢室是很累的,xhd深有體會.時間追述2006年7月9號,那天xhd迫於無奈要從27號樓搬到3號樓,因為10號要封樓了.看著寢室裡的n件物品,xhd開始發呆,因為n是乙個小於2000的整數,實在是太多了,於是xhd決定隨便搬2 k件過去就行了.但還是會很累,...