f[i][j]表示最后一个取样取第i个,并且这是第j个取样的最小代价,预处理一下代价可以很简单的转移
O(n^3)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<queue>
#include<stack>
using namespace std;
#define MAXN 110
#define MAXM 1010
#define INF 1000000000
#define MOD 1000000007
#define eps 1e-8
#define ll long long
int n,E;
int f[MAXN][MAXN],e[MAXN][MAXN],eb[MAXN],a[MAXN];
int main(){
int i,j,k;
scanf("%d%d",&n,&E);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
memset(f,0x3f,sizeof(f));
for(i=n;i;i--){
for(j=n;j>i;j--){
eb[i]+=2*abs(a[j]-a[i]);
}
}
for(i=1;i<=n;i++){
f[i][1]=eb[i];
for(j=1;j<i;j++){
f[i][1]+=2*abs(a[j]-a[i]);
for(k=j+1;k<i;k++){
e[i][j]+=abs(2*a[k]-a[i]-a[j]);
}
e[j][i]=e[i][j];
}
}
for(i=2;i<=n;i++){
for(j=2;j<=i;j++){
for(k=j-1;k<i;k++){
f[i][j]=min(f[i][j],f[k][j-1]-eb[k]+eb[i]+e[k][i]);
}
}
}
for(i=1;i<=n;i++){
int ans=INF;
for(j=i;j<=n;j++){
ans=min(ans,f[j][i]);
}
if(ans<=E){
printf("%d %d\n",i,ans);
break;
}
}
return 0;
}
/*
*/