#include<stdio.h>
#define X 400 //定义最大测资为400
int a[X];
int f[X][X]; //f[i][j] (i<=j) 存放i~j合并为一堆的最小力气花费,若i>j,则为-1
long int m=0; //m为总合并重量
int sum(int start,int end) //计算从起点到终点的累加和
{
int i,s=0;
for(i=start;i<=end;i++)
s+=a[i];
return s;
}
int fun(int s,int e) //求从s开始到e结束合并为一堆的最小力气花费
{
int k,min=99999999; //min 存放最小值,初始其为一个很大的数,可以改为int类型的最大数
if(s==e) //起点和终点为一个点
return 0;
if(s==e-1) //起点和终点相邻
{
f[s][e]=sum(s,e); //写入f数组
return f[s][e];
}
if(f[s][e]!=-1) //不等于-1表示之前已经计算过!所以直接返回
return f[s][e];
for(k=s;k<e;k++) //以前没有计算过,那么递归计算,找最小值!
{
if(min>fun(s,k)+fun(k+1,e))
min=fun(s,k)+fun(k+1,e);
}
min=min+sum(s,e);
f[s][e]=min;
return min;
}
int main()
{
int n;
int w,v=0,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&w,&v);
a[i]=w-v;
}
for(i=0;i<n;i++) //f数组所有元素都赋值-1
for(j=1;j<=n;j++)
f[i][j]=-1;
for(i=0;i<n;i++) //对角线元素为0
f[i][i]=0;
m=fun(0,n-1); //求最小力气!
printf("%ld\n",m);
return 0;
}