思路:用陣列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);
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int n=2005,inf=0x7fffffff;
int a[n];
int shifts[n][n];
int main()
sort(a+1,a+1+n);
for (int i=0;i<=n;i++)
}shifts[0][0]=0;
for (int i=2;i<=n;i++)
}printf("%d\n",shifts[k][n]);
} //system("pause");
return 0;
}
杭電1421 搬寢室
搬寢室是很累的,xhd深有體會.時間追述2006年7月9號,那天xhd迫於無奈要從27號樓搬到3號樓,因為10號要封樓了.看著寢室裡的n件物品,xhd開始發呆,因為n是乙個小於2000的整數,實在是太多了,於是xhd決定隨便搬2 k件過去就行了.但還是會很累,因為2 k也不小是乙個不大於n的整數.幸...
經典DP HDU 1421 搬寢室
題解 用dp i j 代表從i個數中取j對數,首先我們對給定的數排乙個序,使取答案的時候,區域性最優,因為我們有取或者不取兩種狀態,所以當不取的時候我們當前狀態等於上乙個狀態,dp i 1 j 當取的時候,我們上乙個狀態為dp i 2 j 1 代表i 2個數取j 1對數加上取的sqr a i a i...
動態規劃 hdu 1421 搬寢室
problem description 搬寢室是很累的,xhd深有體會.時間追述2006年7月9號,那天xhd迫於無奈要從27號樓搬到3號樓,因為10號要封樓了.看著寢室裡的n件物品,xhd開始發呆,因為n是乙個小於2000的整數,實在是太多了,於是xhd決定隨便搬2 k件過去就行了.但還是會很累,...