您的位置:首页 > 其它

hdu 1421 搬寝室(dp)

2014-03-03 21:08 501 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1421

思路:d[i][j] 表示前i 个,k对的最小值。

这个题还是不太好想状态方程,初始化以后,还要分一下情况。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int maxn = 2000+10;
const int maxm = 1000+10;
const int INF = 1<<28;

int d[maxn][maxm];
int a[maxn];
int _min(int x, int y)
{
return x>y?y:x;
}
int main()
{
int n, k, i, j;
while(~scanf("%d%d", &n, &k))
{
for(i = 1; i <= n; i++)
scanf("%d", &a[i]);
sort(a+1, a+n+1);
for(i = 0; i < maxn; i++)
d[i][0] = 0;

for(i = 2; i <= n; i++)
for(j = 1; j*2 <= i; j++)
{
if(j*2 <= i-1)
d[i][j] = _min(d[i-1][j], d[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]));  //一般情况下,求新增加一个 和以前的比较
else
d[i][j] = d[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]);   //当i为偶数情况时,且j达到最大的时候
}
printf("%d\n", d
[k]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: