题目大意:有这么一个公式 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;
}