#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define allof(obj) (obj).begin(), (obj).end() #define range(i, l, r) for(int i=l;i>1)|y_bit)) #define bit_kth(i, k) ((i >> k)&1) #define bit_highest(i) (i?63-__builtin_clzll(i):-1) #define bit_lowest(i) (i?__builtin_ctzll(i):-1) #define sleepms(t) std::this_thread::sleep_for(std::chrono::milliseconds(t)) using ll = long long; using ld = long double; using ul = uint64_t; using pi = std::pair; using pl = std::pair; using namespace std; template std::ostream &operator << (std::ostream &dest, const std::pair &p) { dest << p.first << ' ' << p.second; return dest; } template std::ostream &operator << (std::ostream &dest, const std::tuple &t) { dest << std::get<0>(t) << ' ' << std::get<1>(t); return dest; } template std::ostream &operator << (std::ostream &dest, const std::tuple &t) { dest << std::get<0>(t) << ' ' << std::get<1>(t) << ' ' << std::get<2>(t); return dest; } template std::ostream &operator << (std::ostream &dest, const std::tuple &t) { dest << std::get<0>(t) << ' ' << std::get<1>(t) << ' ' << std::get<2>(t) << ' ' << std::get<3>(t); return dest; } template std::ostream &operator << (std::ostream &dest, const std::vector> &v) { int sz = v.size(); if (!sz) return dest; for (int i = 0; i < sz; i++) { int m = v[i].size(); for (int j = 0; j < m; j++) dest << v[i][j] << (i != sz - 1 && j == m - 1 ? '\n' : ' '); } return dest; } template std::ostream &operator << (std::ostream &dest, const std::vector &v) { int sz = v.size(); if (!sz) return dest; for (int i = 0; i < sz - 1; i++) dest << v[i] << ' '; dest << v[sz - 1]; return dest; } template std::ostream &operator << (std::ostream &dest, const std::array &v) { if (!sz) return dest; for (int i = 0; i < sz - 1; i++) dest << v[i] << ' '; dest << v[sz - 1]; return dest; } template std::ostream &operator << (std::ostream &dest, const std::set &v) { for (auto itr = v.begin(); itr != v.end();) { dest << *itr; itr++; if (itr != v.end()) dest << ' '; } return dest; } template std::ostream &operator << (std::ostream &dest, const std::map &v) { for (auto itr = v.begin(); itr != v.end(); ) { dest << '(' << itr->first << ", " << itr->second << ')'; itr++; if (itr != v.end()) dest << '\n'; } return dest; } template vector make_vec(size_t sz, T val) { return std::vector(sz, val); } template auto make_vec(size_t sz, Tail ...tail) { return std::vector(tail...))>(sz, make_vec(tail...)); } template vector read_vec(size_t sz) { std::vector v(sz); for (int i = 0; i < (int)sz; i++) std::cin >> v[i]; return v; } template auto read_vec(size_t sz, Tail ...tail) { auto v = std::vector(tail...))>(sz); for (int i = 0; i < (int)sz; i++) v[i] = read_vec(tail...); return v; } // x / y以上の最小の整数 ll ceil_div(ll x, ll y) { assert(y > 0); return (x + (x > 0 ? y - 1 : 0)) / y; } // x / y以下の最大の整数 ll floor_div(ll x, ll y) { assert(y > 0); return (x + (x > 0 ? 0 : -y + 1)) / y; } void io_init() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); } int main() { io_init(); int N; std::cin >> N; auto A = read_vec(N); auto B = read_vec(N); auto C = read_vec(N); auto dp = make_vec(N + 1, 9, -1LL); dp[0][0] = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k <= 2; k++) { int idx = j * 3 + k; if (dp[i][idx] == -1) continue; // -2 if (j == 2) { dp[i + 1][2] = std::max(dp[i + 1][2], dp[i][idx] + A[i]); } // -1 if (j >= 1) { if (j == 2) { dp[i + 1][idx - 3] = std::max(dp[i + 1][idx - 3], dp[i][idx] + B[i]); } else { dp[i + 1][idx - 3] = std::max(dp[i + 1][idx - 3], dp[i][idx] + A[i]); } } // +0 { if (j == 2) { dp[i + 1][idx] = std::max(dp[i + 1][idx], dp[i][idx] + C[i]); } else if (j == 1) { dp[i + 1][idx] = std::max(dp[i + 1][idx], dp[i][idx] + B[i]); } else { dp[i + 1][idx] = std::max(dp[i + 1][idx], dp[i][idx] + A[i]); } } // +1 if (j <= 1 && k <= 1) { int I = (j + 1) * 3 + (k + 1); if (j == 0) { dp[i + 1][I] = std::max(dp[i + 1][I], dp[i][idx] + B[i]); } else if(j == 1) { dp[i + 1][I] = std::max(dp[i + 1][I], dp[i][idx] + C[i]); } } // +2 if (k == 0) { dp[i + 1][8] = std::max(dp[i + 1][8], dp[i][idx] + C[i]); } } } } ll ans = 0; for (int i = 0; i < 9; i++) { ans = std::max(ans, dp[N][i]); } std::cout << ans << '\n'; }