HDU 1421 动态规划
2014-01-18 14:09
344 查看
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; int f[2001][1001]; int a[2001]; int getf(int i,int j) { if(j*2>i) { return 1000000000; } if(j==0) { return 0; } return f[i][j]; } int main() { int n,i,j,k; while(scanf("%d%d",&n,&k)!= EOF) { for(i=1;i<=n;i++) { scanf("%d",&a[i]); } sort(a+1,a+n+1); for(i=1;i<n;i++) { a[i]=a[i+1]-a[i]; a[i]*=a[i]; } for(j=1;j<=k;j++) { for(i=j*2;i<=n;i++) { f[i][j]=min(getf(i-1,j),getf(i-2,j-1)+a[i-1]); } } cout<<f [k]<<endl; } return 0; }先对a[]按小到大排序.设:f[i][j]表示前 i 个物品中搬 j 对的最少疲劳度.
显然,当i==2*j时,f[i][j]=f[i-2][j-1]+(a[i]-a[i-1])^2
因为,当 (a1-a2)^2+(a3-a4)^2 <= (a1-a4)^2+(a3-a2)^2 ( a1<=a2<=a3<=a4 ).
当i>2*j时,f[i][j]=min( f[i-1][j] , f[i-2][j-1]+(a[i]-a[i-1])^2 )
相关文章推荐
- 动态规划 hdu 1421 搬寝室
- 动态规划入门_hdu_1421
- HDU 1421(动态规划)
- hdu 1421 搬寝室 动态规划
- hdu 1421 搬寝室【动态规划】
- hdu 1421:搬寝室(动态规划 DP + 排序)
- HDU 1421 动态规划(DP) 搬寝室
- hdu 1421 动态规划
- HDU-1421 搬寝室 动态规划
- HDU 1421 搬寝室(动态规划)
- HDU 1421 ( 搬寝室动态规划)
- HDU 1421 搬寝室——动态规划
- HDU 1421 (动态规划)
- HDU 1421 搬寝室 动态规划
- HDU 动态规划(46道题目) ( 转 载 )
- HDU 5067 动态规划---旅行商(tsp)问题
- HDU 1069 动态规划(DP) Monkey and Banana
- hdu 1421 搬寝室
- 动态规划M - I NEED A OFFER! HDU - 1203
- HDU 1421:搬寝室