思路分析:
dp[i][j] 表示选取到第 i 个 组成了 j 对的最优答案。
当然排序之后 选取相邻两个是更优的。
if(i==j*2) dp[i][j] = dp[i-2][j-1] + w[i]-w[i-2]^2..
else if( i> j*2 ) dp[i][j] = min (dp[i-2][j-1] + ...^2 , dp[i-1][j])....
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <set> #include <vector> #define maxn 30005 using namespace std; int dp[2005][1005]; int a[2005]; int sqr(int x) { return x*x; } int main() { int n,k; while(scanf("%d%d",&n,&k)!=EOF) { for(int i=1;i<=n;i++)scanf("%d",&a[i]); sort(a+1,a+1+n); memset(dp,0x3f,sizeof dp); for(int i=0;i<=n;i++)dp[i][0]=0; for(int i=2;i<=n;i++) { for(int j=0;2*j<=i;j++) { if(i==j*2)dp[i][j]=min(dp[i][j],dp[i-2][j-1]+sqr(a[i]-a[i-1])); else if(i>j*2){ dp[i][j]=min(dp[i][j],min(dp[i-1][j],dp[i-2][j-1]+sqr(a[i]-a[i-1]))); } } } printf("%d ",dp[n][k]); } return 0; }