区间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;
}