又是动态规划的经典题
序列最优化!从m个里面选n个!dp!
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define M 1000001
#define LL long long
using namespace std;
int a[305],dp[305][35];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) for(int j=1;j<i&&j<=m;j++) dp[i][j]=1000000000;
for(int i=2;i<=n;i++){
int pos=(2+i)/2;
int sum=0;
for(int j=1;j<=i;j++){
sum+=abs(a[j]-a[pos]);
}
dp[i][1]=sum;
}
for(int i=1;i<=n;i++){
for(int j=2;j<=m&&j<i;j++){
for(int k=j;k<i;k++){
int pos=(k+1+1+i)/2;
int sum=0;
for(int t=k+1;t<=i;t++){
sum+=abs(a[t]-a[pos]);
}
dp[i][j]=min(dp[i][j],dp[k][j-1]+sum);
}
}
}
printf("%d",dp[n][m]);
return 0;
}