这题排序一定要从大到小排序,因为新增的筷子因为目前最长,可以不取,而从大到小,新增的筷子一定要取。
dp[i][j] 表示从前i个中去j对
ac代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int dp[5500][1100];
inline int min( int a, int b ){
return ( a < b ? a : b );
}
int main(){
int a[5500], K, N, T;
cin >> T;
while( T-- ){
cin >> K >> N;
for( int i = N; i >= 1; i-- ){
cin >> a[i];
}
memset( dp, 127, 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 * 3 <= i; j++ ){
dp[i][j] = min( dp[i-1][j], dp[i-2][j-1] + ( a[i-1] - a[i] ) * ( a[i-1] - a[i] ) );
}
}
cout << dp[N][K+8] << endl;
}
return 0;
}