原题链接

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