andre_joy

导航

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;
}

posted on 2012-07-23 19:15  andre_joy  阅读(164)  评论(0编辑  收藏  举报