码迷,mamicode.com
首页 > 其他好文 > 详细

DP问题(2) : hdu 1421

时间:2019-12-04 20:19:23      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:tar   就是   ext   背包   get   mes   str   http   php   

题目转自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\n",dp[n][k]);
    }
    return 0;
}

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

永远不要相信memset

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

 

DP问题(2) : hdu 1421

标签:tar   就是   ext   背包   get   mes   str   http   php   

原文地址:https://www.cnblogs.com/juruo-hxy/p/11984843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!