您的位置:首页 > 其它

hdu1421 搬寝室(dp)

2016-01-28 19:56 176 查看
此题是动态规划题。

解题思路:

用w[i]存储n个物品的重量,对其进行排序。

那么当取了第i个物品,必然会取第i-1个物品。

令dp[i][j]表示前i个物品,取j对的最小疲劳度。

若取第i个物品

则:dp[i][j]=dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]);

若不取第i个物品

则:dp[i][j]=dp[i-1][j];

所以状态转移方程为:dp[i][j]=min(dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]),dp[i-1][j]);

代码:

#include "stdio.h"
#include "math.h"
#include "queue"
#include "stdlib.h"
#include "string.h"
#include "algorithm"
#include "iostream"
#define N 100010
#define inf 2147483646
#define eps 1e-8
#define pi acos(-1.0)
using namespace std;
int dp[2005][1005];
int main()
{
int n,k,i,j;
int w[2005];
while(cin>>n>>k)
{
w[0]=0;
for(i=1;i<=n;i++)
cin>>w[i];
sort(w,w+n+1);
for(i=0;i<=n;i++)
for(j=1;j<=k;j++)
dp[i][j]=inf;
dp[0][0]=0;
for(i=2;i<=n;i++)
{
for(j=1;j*2<=i;j++)
{
dp[i][j]=min(dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]),dp[i-1][j]);
}
}
cout<<dp
[k]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: