hdu 1421
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1421
题意:中文……
mark:dp。关键还是找dp[i][j]。i代表前i个物品,j代表多少对。
wa了两次,真2,写顺手了,求了个最大值。。。
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int a[2010]; int dp[2010][2010]; int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } int min(int a, int b) {return a < b ? a : b;} //求最小值!!! int main() { int n,k,m; int i,j; while(~scanf("%d%d", &n, &k)) { for(i = 1; i <= n; i++) scanf("%d", a+i); qsort(a+1, n, 4, cmp); memset(dp, 0, sizeof(dp)); for(i = 2; i <= n; i++) { m = (a[i]-a[i-1])*(a[i]-a[i-1]); for(j = 1; 2*j <= i && j <= k; j++) { if(i == 2*j) dp[i][j] = dp[i-2][j-1]+m; else dp[i][j] = min(dp[i-1][j], dp[i-2][j-1]+m); } } printf("%d\n", dp[n][k]); } return 0; }