状态dp(i,j)表前i只筷子中选出j对的代价,那么状态转移为dp(i,j)=min{dp(i-1,j),dp(i-2,j-1)+(leni-leni-1)^2}。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int dp[5010][1010]={0},len[5010];
int main()
{
int T;
cin>>T;
while(T--){
int k,n;
cin>>k>>n;
k+=8;
for(int i=n;i>=1;i--) cin>>len[i];
memset(dp,0x7F,sizeof(dp));
for(int i=0;i<=n;i++) dp[i][0]=0;
for(int i=3;i<=n;i++)
for(int j=1;j<=k;j++) if(3*j<=i)
dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(len[i]-len[i-1])*(len[i]-len[i-1]));
cout<<dp[n][k]<<endl;
}
return 0;
}