只要是dp一定要注意边界条件,先看转移方程中有哪些是自己一定要处理出来的初始数据,当k == 0 的时候所有dp都是0;当转移的时候如果是2*k>=i 则不再转移,因为不可能出现了,一定要想清楚什么时候可以继续转移
特别注意:对于任何一道题,都要提前想明白点的编号是从1开始还是从0开始,然后后面的所有程序都要按照这个规则去写
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 2005
using namespace std;
int a[MAX];
int dp[MAX][MAX];
int main()
{
int n,k;
while(cin>>n>>k){
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){ //计算相邻二者的疲劳度
a[i]=(a[i]-a[i+1])*(a[i]-a[i+1]);
}
memset(dp,0x3f,sizeof(dp)); //要求最小,就初始化为最大,反之亦然
for(int i=0;i<=n;i++)
dp[i][0]=0;
dp[1][1]=a[1];
for(int i=2;i<=n;i++){
for(int j=1;j<=k;j++){
dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+a[i]);
}
}
printf("%d\n",dp[n][k]);
}
return 0;
}