http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=234
http://acm.hdu.edu.cn/showproblem.php?pid=1500

#include<iostream>
using namespace std;
long dp[5001][1009];//dp[i][j]表示从第i个筷子到第n个筷子中取j对的最优值
int
 main()
{
    
long t,k,n,i,j;
    scanf(
"%ld",&t);
    
while(t--)
    
{
        
long chopsticks[5001],num[5001];
        
//cin>>k>>n;
        scanf("%ld%ld",&k,&n);
        k 
+= 8;
        
for(i=1;i<=n;i++)
            scanf(
"%ld",&chopsticks[i]);

        
for(i=1;i<n;i++)
            num[i] 
= (chopsticks[i+1- chopsticks[i]) * (chopsticks[i+1- chopsticks[i]);

        
for(i=0;i<=n;i++)
            
for(j=0;j<=k;j++)
                dp[i][j] 
= 1024000000;//初值一定要足够大

        
for(i=0;i<=n;i++)//取0对筷子
            dp[i][0= 0;
        
        
for(i=n-2;i>=1;i--)//从后往前
        {
            
for(j=1;3*j<=(n-i+1);j++)
            
{
                dp[i][j] 
= dp[i+1][j];
                
if(dp[i][j] > dp[i+2][j-1+ num[i])
                    dp[i][j] 
= dp[i+2][j-1+ num[i];
            }

        }

        
//cout<<dp[1][k]<<endl;
        printf("%ld\n",dp[1][k]);
    }

    
return 0;
}