HDU1421搬寝室(简单DP)

当然,还可以加滚动数组优化。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
#include<cmath>
#include<algorithm>
using namespace std;
const long long  inf=1000000000000000000;
long long  p[2010],dp[2010][2010];
int main()
{
    int n,K,i,j;
    while(~scanf("%d%d",&n,&K)){
        for(i=1;i<=n;i++) 
         scanf("%lld",&p[i]);
        for(i=0;i<=n;i++) dp[i][0]=0;
        sort(p+1,p+n+1);
        for(i=1;i<=n;i++)
         for(j=1;j<=i;j++) dp[i][j]=inf;
        for(i=1;i<=n;i++){
            for(j=1;j<=i;j++){
                if(i-1>=j) dp[i][j]=min(dp[i][j],dp[i-1][j]);
                if(j>=2) dp[i][j]=min(dp[i][j],(dp[i-2][j-2]+(p[i-1]-p[i])*(p[i-1]-p[i])));
            }
        }
        printf("%lld
",dp[n][2*K]);
    }
    return 0;
} 
 
原文地址:https://www.cnblogs.com/hua-dong/p/7634118.html