定义一个三元组(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(); } }