#include<cstdio>
#include<algorithm>
const int size=(1<<20)+1;char buf[size],*p1=buf,*p2=buf;char buffer[size];int op1=-1;const int op2=size-1;
inline char readchar() {if(p1!=p2) {return *p1++;}return p1==(p2=(p1=buf)+fread(buf,1,size-1,stdin))?EOF:*p1++;}
inline void flush() {fwrite(buffer,1,op1+1,stdout),op1=-1;}
inline void writechar(const char &x) {if(op1==op2) flush();buffer[++op1]=x;}
#ifndef ONLINE_JUDGE
#define readchar getchar
#endif
#define putchar writechar
inline int read() {int s=1,c=readchar(),x=0;while(c<=32) {c=readchar();}if(c=='-') {s=-1,c=readchar();}for(; ('0'<=c && c<='9'); c=readchar()) {x=x*10+c-'0';}return x*s;}
inline void write(long long x) {if(x<0) {writechar('-'),x=-x;}char s[25];int n=0;while(x || !n) {s[n++]='0'+x%10,x/=10;}while(n--) {writechar(s[n]);}}
int score(int x, int y) {
if(x == y + 1 || x == y - 2) return 2;
else if(x == y) return 1;
else return 0;
}
const int N = 1e3 + 5;
int n, a[N], b[N], c[N], f[N][N][3];
int main(){
n = read();
for(int i = 1; i <= n; ++i) a[i] = read();
for(int i = 1; i < n; ++i) b[i] = read();
for(int i = 1; i <= n; ++i) c[i] = read();
for(int i = 1; i <= n; ++i)
for(int j = 0; j < i; ++j)
for(int k = 0; k < 3; ++k) {
int t = a[i] * score(k, c[i]);
if(i - 1 > j || j == 0) f[i][j][k] = f[i - 1][j][k] + t;
if(j)
for(int p = 0; p < 3; ++p)
if(p != k) f[i][j][k] = std::max(f[i][j][k], f[i - 1][j - 1][p] + t - b[j]);
}
int ans = 0;
for(int j = 0; j < n; ++j)
for(int k = 0; k < 3; ++k)
ans = std::max(ans, f[n][j][k]);
write(ans); flush();
return 0;
}