定义一个三元组(a,b,c)(a⩽b⩽c), 它的权值为 (a−b)^2,

给定 n(n⩽5000)n(n5000) 个数,要求选出 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();
 	}	
 }

 

 

posted on 2023-04-27 02:23  towboat  阅读(18)  评论(0)    收藏  举报