hdu 1421 搬寝室

来源:互联网 发布:java static final区别 编辑:程序博客网 时间:2024/03/29 04:08

http://acm.hdu.edu.cn/showproblem.php?pid=1421

先排序然后dp

dp方程为:dp[i][j]=min(dp[i-2][j-1]+(num[i]-num[i-1])^2,dp[i-1][j]);

表示到i之前(包括i)搬j对需要的最少疲劳值

注意处理好一下边界就好

代码:

#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <iostream>#include <algorithm>#include <map>#include <set>#include <queue>using namespace std;int dp[2005][1005];int num[2005];const int inf=1000000000;int main(){    int n,k;    while(scanf("%d%d",&n,&k)==2)    {        for(int i=0;i<=n;i++)        for(int j=0;j<=k;j++)        {            if(j==0)            dp[i][j]=0;            else            dp[i][j]=inf;        }        for(int i=1;i<=n;i++)        scanf("%d",&num[i]);        sort(num+1,num+1+n);        for(int i=2;i<=n;i++)        for(int j=1;j<=i/2;j++)        {            dp[i][j]=min(dp[i-2][j-1]+(num[i]-num[i-1])*(num[i]-num[i-1]),dp[i-1][j]);        }        printf("%d\n",dp[n][k]);    }}