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的主要内容,如果未能解决你的问题,请参考以下文章