先把球按照坐标排序。
dp[i][j]考虑前i个球,其中最后一个钉住的是第j个球所需的最小代价。
dp[i][j]=(x[i]-x[j])+(x[i-1]-x[j])+...+(x[j+1]-x[j])+dp[j][j] (i!=j)
dp[i][i]=c[i]+f[i-1]
f[i]=min(dp[i][j])(1=<j<=i)
ans=f[n]
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#define maxn 3009
#define INF 1LL<<60
using namespace std;
struct node
{
int x,c;
bool operator<(const node &rhs)const
{
return x<rhs.x;
}
}p[maxn];
__int64 dp[maxn][maxn],sum[maxn],f[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].c);
}
sort(p+1,p+1+n);
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+p[i].x;
}
dp[1][1]=p[1].c;f[1]=p[1].c;
for(int i=2;i<=n;i++)
{
f[i]=INF;
for(int j=1;j<i;j++)
{
dp[i][j]=sum[i]-sum[j]-1LL*p[j].x*(i-j)+dp[j][j];
f[i]=min(f[i],dp[i][j]);
}
dp[i][i]=p[i].c+f[i-1];
f[i]=min(f[i],dp[i][i]);
}
printf("%I64d\n",f[n]);
//system("pause");
return 0;
}