HDU 1421搬寝室 DP

来源:互联网 发布:淘宝美工修图技巧 编辑:程序博客网 时间:2024/05/16 23:55

http://acm.hdu.edu.cn/showproblem.php?pid=1421

先进行排序,前i个物品,取K对,对于第i个物品是否取得, 若不取 ,此时 为 前i-1个物品取K对的值, 若取, 则第i个和第i-1个要组成一对同时取得,此时 为  前i-2个物品取k-1对的值 +  i和i-1 之差的平方。 

 状态转移方程    dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(num[i]-num[i-1])*(num[i]-num[i-1]));

同时注意一下初始值

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define PI acos(-1.0)#define max(a,b) (a)>(b)? (a):(b)#define min(a,b) (a)>(b)? (b):(a)#define INT_MIN -0x7FFFFFFF#define INT_MAX 0x7FFFFFFFint num[2005];int dp[2005][1005];int cmp(const void *p1,const void *p2){    return *(int *)p1- *(int *)p2;}int main(){    // freopen("in.txt","r",stdin);    int i,j,k,n,m;    while(scanf("%d%d",&n,&k)!=EOF)    {        for(i=1;i<=n;i++)            scanf("%d",&num[i]);        qsort(num+1,n,sizeof(num[0]),cmp);        //memset(dp,0,sizeof(dp));        for(i=1;i<=n;i++)            for(j=1;j<=k;j++) dp[i][j]=100000000;        for(i=1;i<=n;i++)        {            for(j=1;j<=k;j++)            {                if(i>=2*j)                dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(num[i]-num[i-1])*(num[i]-num[i-1]));            }        }        printf("%d\n",dp[n][k]);    }    return 0;}


原创粉丝点击