杭电1421java实现
Problem Description
搬寢室是很累的,xhd深有體會.時間追述2006年7月9號,那天xhd迫于無奈要從27號樓搬到3號樓,因為10號要封樓了.看著寢室里的n件物品,xhd開始發呆,因為n是一個小于2000的整數,實在是太多了,于是xhd決定隨便搬2k件過去就行了.但還是會很累,因為2k也不小是一個不大于n的整數.幸運的是xhd根據多年的搬東西的經驗發現每搬一次的疲勞度是和左右手的物品的重量差的平方成正比(這里補充一句,xhd每次搬兩件東西,左手一件右手一件).例如xhd左手拿重量為3的物品,右手拿重量為6的物品,則他搬完這次的疲勞度為(6-3)^2 = 9.現在可憐的xhd希望知道搬完這2k件物品后的最佳狀態是怎樣的(也就是最低的疲勞度),請告訴他吧.
Input
每組輸入數據有兩行,第一行有兩個數n,k(2<=2k<=n<2000).第二行有n個整數分別表示n件物品的重量(重量是一個小于2^15的正整數).
Output
對應每組輸入數據,輸出數據只有一個表示他的最少的疲勞度,每個一行.
Sample Input
2 1
1 3
Sample Output
4
首先,他要求拿物品的質量差的平方,一次拿兩個,拿就要把數據先排序,因為只有這樣才能拿到最小的。
dp[i][j]表示i個數據拿j次疲勞度最小。
然后考慮初始化問題,就是當數據只有剛好拿完的時候,那么結果就是從前到后兩兩拿最小。表達式為if(i==2j) {dp[i][j]=dp[i-2][j-1] (a[i]-a[i-1])(a[i]-a[i-1]);}
一般情況,對于每一個新物品,都要考慮拿不拿這個物品,如果拿了。他肯定要和前面一個湊成對,前面a[i-1]要確保不能動,那么dp[i][j]=dp[i-2][j-1] (a[i]-a[i-1])(a[i]-a[i-1]),如果不拿,那么dp[i][j]=dp[i-1][j];表示拿前i-1個數據拿j次。
那么狀態轉移方程為:if(i>2j)dp[i][j]=min(dp[i-2][j-1] (a[i]-a[i-1])*(a[i]-a[i-1]),dp[i-1][j]);
注意i.和j 的大小關系。附上代碼:
總結
以上是生活随笔為你收集整理的杭电1421java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杭电1284钱币兑换问题—背包dp/母函
- 下一篇: 杭电1978java实现