您的位置:首页 > 其它

hdu-1421 搬寝室

2017-07-14 20:09 190 查看
题目链接:hdu-1421

dp[i][j]表示从前j个中取i对,排序后,肯定两两相邻的平方差和最小,若取i,则肯定i与i-1一对,若不选,则取前面值,两者中取最小值,dp[i][j] = min(dp[i][j - 1], dp[i - 1][j - 2] + (s[j] - s[j - 1])*(s[j] - s[j - 1]));

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1005][2005];// i表示k对,j表示前n个,前j个中取k对消耗的最少疲劳
int maxx=0x3fffffff;//最大值
int main()
{
int n,k;
while (cin >> n >> k)
{
int i, j;
int s[2005];
memset(dp,0,sizeof(dp));//将全部变为0,包括第0行
memset(s,0,sizeof(s));
for (int i = 1; i <= n; i++)
cin >> s[i];
sort(s+1, s + n+1);//从小到大排序,abcd中,肯定ab的平方差加上cd的平方差和最小
for (int i = 1; i <=k; i++)
for (int j = 0; j <= n; j++)
dp[i][j] = maxx;//除第一行以外全部变为最大值
for(int i=1;i<=k;i++)
for (int j = 2*i; j <=n; j++)//i对,则j从2*i开始打表
{
//若选这个,则dp[i][j]= dp[i - 1][j - 2] + (s[j] - s[j - 1])*(s[j] - s[j - 1]),不选则取左边的值,两者取最大值
dp[i][j] = min(dp[i][j - 1], dp[i - 1][j - 2] + (s[j] - s[j - 1])*(s[j] - s[j - 1]));
}
cout << dp[k]
<< endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: