1. 程式人生 > >HDU 1421 搬寢室

HDU 1421 搬寢室

using str -s 正整數 code 無奈 size 補充 7月

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

Sample Output

4

分析 
先排序,要選擇兩個成一對的話一定是選鄰近的。定義dp[i][j]為i個物體選了j對,其中i>=2*j。
dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+a[i-1]);即選擇i-1和i成一對或者不選。
#include<iostream>
#include
<cstdio> #include<cmath> #include<cstdlib> #include<algorithm> #include<cstring> #include <queue> #include <vector> #include<bitset> #include<map> #include<deque> using namespace std; typedef long long LL; const int maxn = 1e4+5
; const int mod = 77200211+233; typedef pair<int,int> pii; #define X first #define Y second #define pb push_back //#define mp make_pair #define ms(a,b) memset(a,b,sizeof(a)) const int inf = 0x3f3f3f3f; #define lson l,m,2*rt #define rson m+1,r,2*rt+1 typedef long long ll; #define N 100010 int dp[2020][2020]; int a[2020]; int main(){ int n,k; while(~scanf("%d%d",&n,&k)){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); for(int i=1;i<n;i++){ a[i]-=a[i+1]; a[i]*=a[i]; } ms(dp,0); for(int i=1;i<=n;i++){ for(int j=1;j<=k;j++){ if(2*j>i) dp[i][j]=inf; else dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+a[i-1]); } } cout<<dp[n][k]<<endl; } return 0; }

 

HDU 1421 搬寢室