代码:
#include <bits/stdc++.h>
#define gc getchar()
#define N 109
using namespace std;
int n,x[N],l[N],num[N],L[N],R[N],a[N],b[N],dp[N][N*3][N*3],ans;
vector <int> lsh;
int read()
{
int x=1;
char ch;
while (ch=gc,ch<'0'||ch>'9') if (ch=='-') x=-1;
int s=ch-'0';
while (ch=gc,ch>='0'&&ch<='9') s=s*10+ch-48;
return s*x;
}
bool cmp(int aa,int bb)
{
return x[aa]<x[bb];
}
int main()
{
n=read();
for (int i=1;i<=n;i++)
{
x[i]=read(),l[i]=read(),num[i]=i;
lsh.push_back(x[i]-l[i]),lsh.push_back(x[i]),lsh.push_back(x[i]+l[i]);
}
sort(num+1,num+n+1,cmp);
sort(lsh.begin(),lsh.end());
lsh.erase(unique(lsh.begin(),lsh.end()),lsh.end());
for (int i=1;i<=n;i++)
a[i]=x[num[i]],b[i]=l[num[i]];
for (int i=1;i<=n;i++)
{
L[i]=lower_bound(lsh.begin(),lsh.end(),a[i]-b[i])-lsh.begin()+1;
x[i]=lower_bound(lsh.begin(),lsh.end(),a[i])-lsh.begin()+1;
R[i]=lower_bound(lsh.begin(),lsh.end(),a[i]+b[i])-lsh.begin()+1;
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=lsh.size();j++)
for (int k=j;k<=lsh.size();k++)
{
dp[i][j][max(R[i],k)]=max(dp[i][j][max(R[i],k)],dp[i-1][j][k]+max(0,lsh[R[i]-1]-lsh[k-1]));
if (L[i]<=j) dp[i][0][max(x[i],k)]=max(dp[i][0][max(x[i],k)],dp[i-1][j][k]+max(0,lsh[x[i]-1]-lsh[k-1]));
}
for (int j=1;j<=lsh.size();j++)
{
if (j<x[i])
{
dp[i][0][R[i]]=max(dp[i][0][R[i]],dp[i-1][0][j]+lsh[R[i]-1]-lsh[x[i]-1]);
for (int k=j;k<x[i];k++)
dp[i][k][R[i]]=max(dp[i][k][R[i]],dp[i-1][0][j]+lsh[R[i]-1]-lsh[k-1]);
}
else
dp[i][0][max(R[i],j)]=max(dp[i][0][max(R[i],j)],dp[i-1][0][j]+max(0,lsh[R[i]-1]-lsh[j-1]));
dp[i][0][max(x[i],j)]=max(dp[i][0][max(x[i],j)],dp[i-1][0][j]+max(0,lsh[x[i]-1]-lsh[max(j,L[i])-1]));
for (int k=j;k<L[i];k++)
dp[i][k][max(x[i],j)]=max(dp[i][k][max(x[i],j)],dp[i-1][0][j]+lsh[x[i]-1]-lsh[k-1]);
}
}
for (int i=1;i<=lsh.size();i++)
ans=max(ans,dp[n][0][i]);
printf("%d\n",ans);
return 0;
}