状态转移方程:将情况分为选a[j]和不选a[j]两种情况,选a[j]必然选a[j-1]
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 using namespace std; 10 int dp[1010][2020]; 11 int main(int argc, char *argv[]) 12 { 13 int n,k,a[2020]; 14 while(scanf("%d%d",&n,&k)!=EOF) 15 { 16 for(int i=1;i<=n;i++) 17 scanf("%d",&a[i]); 18 sort(a+1,a+n+1); 19 memset(dp,0,sizeof(dp)); 20 for(int i=1;i<=k;i++) 21 { 22 dp[i][i*2]=dp[i-1][i*2-2]+(a[i*2]-a[i*2-1])*(a[i*2]-a[i*2-1]); 23 for(int j=2*i+1;j<=n;j++) 24 { 25 dp[i][j]=min(dp[i][j-1],dp[i-1][j-2]+(a[j]-a[j-1])*(a[j]-a[j-1])); 26 } 27 } 28 printf("%d\n",dp[k][n]); 29 30 } 31 return 0; 32 }