搬寢室是很累的,xhd深有體會.時間追述2023年7月9號,那天xhd迫於無奈要從27號樓搬到3號樓,因為10號要封樓了.看著寢室裡的n件物品,xhd開始發呆,因為n是乙個小於2000的整數,實在是太多了,於是xhd決定隨便搬2k件過去就行了.但還是會很累,因為2k也不小是乙個不大於n的整數.幸運的是xhd根據多年的搬東西的經驗發現每搬一次的疲勞度是和左右手的物品的重量差的平方成正比(這裡補充一句,xhd每次搬兩件東西,左手一件右手一件).例如xhd左手拿重量為3的物品,右手拿重量為6的物品,則他搬完這次的疲勞度為(6-3)^2= 9.
現在可憐的xhd希望知道搬完這2*k件物品後的最佳狀態是怎樣的(也就是最低的疲勞度),請告訴他吧.
input
每組輸入資料有兩行,第一行有兩個數n,k(2<=2*k<=n<2000).第二行有n個整數分別表示n件物品的重量(重量是乙個小於2^15的正整數).
output
對應每組輸入資料,輸出資料只有乙個表示他的最少的疲勞度,每個一行. sample input
2 11 3
sample output
4思路:用陣列a[ ]來儲存初始資料,陣列shifts[j][i]表示從一共i個資料中取出j對。 首先要理解與乙個物品重量差值最小的一定是與它相鄰的另乙個物品,所以第一步是對這些重量排序。
接下來總結狀態轉移方程: 假設k=1,n=2.即從2個物品中拿出1對。
那麼shifts[1][2]=(a[2]-a[1])^2. 假設k=1,n=3.即從3個物品中拿出1對。
那麼shifts[1][3]=shifts[1][2]和(a[3]-a[2])^2中最小的乙個。即前兩個中最小的一對或者後兩個中最小的一對,即最後一對。不可能是(1,3).
假設k=2,n=3.即從3個物品中拿出2對。
impossible! shifts[2][3]=infinity.
假設k=1,n=4.即從4個物品中拿出1對。
那麼shifts[1][4]=shifts[1][3]和(a[4]-a[3])^2中最小的乙個。即前三個中最小的一對或者最後一對。
假設k=2,n=4.即從4個物品中拿出2對。
那麼shifts[2][4]=shifts[2][3]和shifts[1][2]+(a[4]-a[3])^2中最小的乙個。即前三個中最小的兩對或者前兩個中最小的一對加最後一對。
假設k=1,n=5.即從5個物品中拿出1對。
那麼shifts[1][5]=shifts[1][4]和(a[5]-a[4])^2中最小的乙個。即前四個中最小的一對或者最後一對。
假設k=2,n=5.即從5個物品中拿出2對。
那麼shifts[2][5]=shifts[2][4]和shifts[1][3]+(a[4]-a[3])^2中最小的乙個。即前四個中最小的兩對或者前三個中最小的一對加最後一對。
……假設k=j,n=i.即從i個物品中拿出j對。
那麼shifts[j][i]=shifts[j][i-1]和shifts[j-1][i-2]+(a[i]-a[i-1])^2中最小的乙個。即前i-1個中最小的j對或者前i-2個中最小的j-1對加最後一對。
則狀態轉移方程為:
shifts[j][i]=min(shifts[j][i-1],shifts[j-1][i-2]+(a[i]-a[i-1])^2);
hdu 1421 搬寢室 解題報告
思路 用f表示i件要搬j件的最小,主要在於要不要搬後乙個 如果要,則getf i 2,j 1 a i 1 否則,getf i 1,j 公式 f n k min f n 1 k f n 2 k 1 a n 1 getf用來處理一些邊界情況,例如i必須比2 j大或等於,j不能 0 如下 include ...
動態規劃 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對的總疲勞度,則對於第...