区间dp,由于n很小,开两维,然后外加一维,最后遍历完所有区间内的点停在最左边还是最右边。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<vector>
#include<queue>
#include<stack>
#include<iostream>
#include<sstream>
#define x first
#define y second
#define lson u<<1
#define rson u<<1|1
#define pb push_back
#define pu pushup
#define mk make_pair
using namespace std;
#define ll long long
#define mod 1000000007
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
const int N=1010;
int f[N][N][2];
int p[N];
int t[N];
int n;
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
cin>>p[i];
int pos=0;
for(int i=1;i<=n;i++)
{
cin>>t[i];
if(!t[i])
pos=i;
}
memset(f,0x3f,sizeof f);
f[pos][pos][0]=f[pos][pos][1]=0;
for(int len=2;len<=n;len++)
{
for(int l=1;l<=n;l++)
{
int r=l+len-1;
if(f[l+1][r][0]+p[l+1]-p[l]<=t[l])
f[l][r][0]=f[l+1][r][0]+p[l+1]-p[l];
if(f[l+1][r][1]+p[r]-p[l]<=t[l])
f[l][r][0]=min(f[l][r][0],f[l+1][r][1]+p[r]-p[l]);
// if(f[l][r-1][0]+p[r]-p[l]<=t[r])
// f[l][r][0]=min(f[l][r][0],f[l][r-1][0]+p[r]-p[l]);
// if(f[l][r-1][1]+p[r]-p[r-1]<=t[r])
// f[l][r][0]=min(f[l][r][0],f[l][r-1][1]+p[r]-p[r-1]);
if(f[l][r-1][0]+p[r]-p[l]<=t[r])
f[l][r][1]=min(f[l][r][1],f[l][r-1][0]+p[r]-p[l]);
if(f[l][r-1][1]+p[r]-p[r-1]<=t[r])
f[l][r][1]=min(f[l][r-1][1]+p[r]-p[r-1],f[l][r][1]);
}
}
if(min(f[1][n][0],f[1][n][1])==0x3f3f3f3f)
puts("-1");
else
printf("%d\n",min(f[1][n][0],f[1][n][1]));
return 0;
}