DP问题 : hdu 1421

Posted juruo-hxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DP问题 : hdu 1421相关的知识,希望对你有一定的参考价值。

题目转自hdu 1421,题目传送门

题目大意:

给你n个物品,你要搬走2*k个(也就是搬k次)

每次搬需要花费v,v=(ai-aj)2 (i表示左手拿的物品重量,j表示右手拿的物品的重量)

要求所有v相加得数最少

不难看出,这就像是01背包

这道题很水但我还是调了0.25h

感谢wsy大佬的帮助

emmm......

首先,这肯定是一个n*k的dp

其中,i表示有i个物品,j表示需要搬j回

那么我们可以得出它的转移方程:

dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(int)pow((w[i]-w[i-1]),2));

让后就很简单了

才怪,上面的我10min就想出来了,下面才让我最头疼

初始化

下面是我原来写的初始化:

memset(dp,0x7f,sizeof(dp));

然后各种WA

然后改了一下(25min),如下:

for(int i=0;i<=n;i++) for(int j=1;j<=k;j++) dp[i][j]=inf;

然后就AC了!!!

一个memset让我调了0.25h!(好不值)

以下是AC代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<cmath>
#define inf 2147483647
using namespace std;
int n,k;
int w[2005];
int dp[2005][2005];
int main()
{
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        for(int i=0;i<=n;i++) for(int j=1;j<=k;j++) dp[i][j]=inf;
//        memset(dp,0x7f,sizeof(dp));
        for(int i=1;i<=n;i++) scanf("%d",&w[i]);
        sort(w+1,w+1+n);
        dp[0][0]=0;
        for(int i=2;i<=n;i++) for(int j=0;2*j<=i;j++)
        {
            dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(int)pow((w[i]-w[i-1]),2));
//            cout<<"dp["<<i<<"]["<<j<<"]="<<dp[i][j]<<endl;
        }
        printf("%d
",dp[n][k]);
    }
    return 0;
}

从这道题我得到了一个深刻的教训

永远不要相信memset

这道题就这样水过了,就这样......

 

以上是关于DP问题 : hdu 1421的主要内容,如果未能解决你的问题,请参考以下文章

题解报告:hdu 1421 搬寝室

hdu1421 搬寝室(dp)

hdu1421 搬寝室(dp)

[HDU 1421]搬寝室(富有新意的DP)

hdu 1421 搬寝室(dp)

HDU1421搬寝室(简单DP)