定义一个三元组(a,b,c)(a⩽b⩽c), 它的权值为 (a−b)^2,
给定 n(n⩽5000)n(n⩽5000) 个数,要求选出 k+8 个三元组,使得这k+8个三元组权值和最小。
输入数据是单调递增的。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N=5004;
const int inf =1e9 ;
#define int long long
int n,m,a[N],f[N][N];
inline int pow2(int x){return x*x;}
void sov(){
int i,j;for(i=n;i;i--) cin>>a[i];
memset(f,127,sizeof f);
for(i=n;i;i--) f[i][0]=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(j*3<=i)
f[i][j]=min(f[i-2][j-1]+pow2(a[i]-a[i-1]),
f[i-1][j]);
}
}
cout<<f[n][m]<<endl;
}
signed main(){
int tes;cin>>tes;
while(tes--){
cin>>m>>n;m+=8;
sov();
}
}
浙公网安备 33010602011771号