飞机加油有关问题!福州大学OJ的一道题目~大家来给个解法~多谢

飞机加油问题!福州大学OJ的一道题目~大家来给个解法~谢谢
Problem 1416 飞机加油问题

Problem Description
F国际航空公司在世界范围有n个国际机场。第i 个国际机场到中心机场的距离为di, i=1,…,n。从国际机场j 到国际机场i 的飞行费用为c(i,j) = s + (dj - di)2 ,s 为地面加油费用。从任何国际机场飞往中心机场的飞机可以在任一国际机场加油后继续飞行。飞机加油问题要求确定从距中心机场最远的国际机场飞到中心机场的最少费用。

编程任务:

对于给定的n个国际机场到中心机场的距离d1,d2,...,dn ,以及地面加油费用s,编程计算从距中心机场最远的国际机场飞到中心机场的最少费用。

Input
第一行有2 个整数n (n<=400,000)和s,表示有n个国际机场(不包括中心机场),地面加油费用s。接下来的1行中每行有n个整数d1,d2,...,dn,表示给定的 n个国际机场到中心机场的距离。

Output
将编程计算出的最小费用输出。

Sample Input
5 10
1 3 6 7 10

Sample Output
64


大家帮忙看看吧!给个解法思路的,最好能详细点,谢谢了~~

------解决方案--------------------
用动态规划。
首先将距离数组d[1..n]升序排序,然后将d中重复的元素剔除(为了降低时间复杂度),假设剔除后剩余m个元素。另t[i]表示机场i到中心机场的最小费用,则有递推式:t[i]=min{s+d[i]^2,s+(d[j]-d[i])^2+t[j]}(1<=j<i),从1到m递推,最后t[m]即最远机场m到中心机场的最小费用。
------解决方案--------------------
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int t[400000];
int d[400000];
int main()
{
int n,s,i,j,len,temp;
while(cin>>n>>s)
{
for(i=0;i<n;i++)
{
scanf("%d",&t[i]);
}
sort(t,t+n);//排序
for(i=0,j=1;i<n;i++)//剔除重复元素
{
if(i==0)
d[j++]=t[i];
else
{
if(t[i]!=t[i-1])
{
d[j++]=t[i];
}
}
}
len=j;
t[1]=s+d[1]*d[1];
for(i=2;i<len;i++)
{
t[i]=s+d[i]*d[i];
for(j=1;j<i;j++)
{
temp=s+(d[i]-d[j])*(d[i]-d[j])+t[j];
if(temp<t[i])
t[i]=temp;

}
}
cout<<t[len-1]<<endl;
}
return 0;
}