题目大意:有这么一个公式 A,B,C(A<=B<=C), (A-B)^2来衡量这对数字的好坏,值越小越好。现在给出一个数组,要求每三个配对,最后得到的每组值总和最小。
解法:我是复制粘贴的代码
参考代码:
/* * 代码来源:www.cnblogs.com/zhexipinnong/archive/2012/04/19/2457217.html * dp的问题需要再专题研究 * */ #include <iostream> using namespace std; int dp[5050][1010]; #define maxn 1<<30 int a[5050]; int main() { int ncase,guests,chopsticks,i,j; cin>>ncase; while(ncase--) { cin>>guests>>chopsticks; for(i = chopsticks;i >= 1;i--) cin>>a[i]; for(i = 1;i < 5050;i++) for(j = 0;j < 1010;j++) { if(j == 0) dp[i][j] = 0; else dp[i][j] = maxn; } for(j = 1;j <= guests + 8;j++) for(i = 3;i <= chopsticks;i++) { if(i >= j * 3) { dp[i][j] = dp[i - 1][j]; int temp = dp[i - 2][j - 1] + (a[i - 1] - a[i]) * (a[i - 1] - a[i]); if(temp < dp[i][j]) dp[i][j] = temp; } } cout<<dp[chopsticks][guests + 8]<<endl; } return 0; }