DP问题(2) : hdu 1421

这道题很水但我还是调了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\n",dp[n][k]);
    }
    return 0;
}

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

永远不要相信memset

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

猜你喜欢

转载自www.cnblogs.com/juruo-hxy/p/11984843.html