## https://yukicoder.me/problems/no/2889 NO_USE_TOAST = 0 USING_FIRST_TOAST = 1 # 1回目の焼き最中 USING_SECOND_TOAST_WITH_BOTH = 2 # 2回目(両面焼き)の焼き最中 USING_FISRT_TOAST_FINISHED_SECOND = 3 # 1回目の焼き最中(両面焼き終了) USED_FIRST_TOAST_FINISHED_SECIOND = 4 # 1回目の焼き終了(両面焼き終わり) USED_FIRST_TOAST = 5 # 1回目の焼き終了(まだ焼きがのこっている) USING_SECOND_TOAST = 6 # 2回目の焼きの最中 USED_SECOND_TOAST = 7 # 2回目の焼きが終わり STATE_NUM = 8 def main(): N = int(input()) A = list(map(int, input().split())) B = list(map(int, input().split())) C = list(map(int, input().split())) dp = [-1] * STATE_NUM dp[NO_USE_TOAST] = 0 for i in range(N): a = A[i] b = B[i] c = C[i] new_dp = [-1] * STATE_NUM # トースト使っていない if dp[NO_USE_TOAST] >= 0: value = dp[NO_USE_TOAST] new_dp[NO_USE_TOAST] = max(new_dp[NO_USE_TOAST], a + value) new_dp[USING_FIRST_TOAST] = max(new_dp[USING_FIRST_TOAST], b + value) new_dp[USING_SECOND_TOAST_WITH_BOTH] = max(new_dp[USING_SECOND_TOAST_WITH_BOTH], c + value) # 1回目使っている if dp[USING_FIRST_TOAST] >= 0: value = dp[USING_FIRST_TOAST] new_dp[USING_FIRST_TOAST] = max(new_dp[USING_FIRST_TOAST], b + value) new_dp[USING_SECOND_TOAST_WITH_BOTH] = max(new_dp[USING_SECOND_TOAST_WITH_BOTH], c + value) new_dp[USED_FIRST_TOAST] = max(new_dp[USED_FIRST_TOAST], a + value) # 両面焼き途中 if dp[USING_SECOND_TOAST_WITH_BOTH] >= 0: value = dp[USING_SECOND_TOAST_WITH_BOTH] new_dp[USING_SECOND_TOAST_WITH_BOTH] = max(new_dp[USING_SECOND_TOAST_WITH_BOTH], c + value) new_dp[USING_FISRT_TOAST_FINISHED_SECOND] = max(new_dp[USING_FISRT_TOAST_FINISHED_SECOND], b + value) new_dp[USED_FIRST_TOAST_FINISHED_SECIOND] = max(new_dp[USED_FIRST_TOAST_FINISHED_SECIOND], a + value) # 1回目使っている(両面焼きdone) if dp[USING_FISRT_TOAST_FINISHED_SECOND] >= 0: value = dp[USING_FISRT_TOAST_FINISHED_SECOND] new_dp[USING_FISRT_TOAST_FINISHED_SECOND] = max(new_dp[USING_FISRT_TOAST_FINISHED_SECOND], b + value) new_dp[USED_FIRST_TOAST_FINISHED_SECIOND] = max(new_dp[USED_FIRST_TOAST_FINISHED_SECIOND], a + value) if dp[USED_FIRST_TOAST_FINISHED_SECIOND] >= 0: new_dp[USED_FIRST_TOAST_FINISHED_SECIOND] = max(new_dp[USED_FIRST_TOAST_FINISHED_SECIOND], dp[USED_FIRST_TOAST_FINISHED_SECIOND] + a) # 1回目使い終わった(まだ2回目蹴る) if dp[USED_FIRST_TOAST] >= 0: new_dp[USED_FIRST_TOAST] = max(new_dp[USED_FIRST_TOAST], a + dp[USED_FIRST_TOAST]) new_dp[USING_SECOND_TOAST] = max(new_dp[USING_SECOND_TOAST], b + dp[USED_FIRST_TOAST]) if dp[USING_SECOND_TOAST] >= 0: new_dp[USING_SECOND_TOAST] = max(new_dp[USING_SECOND_TOAST], b + dp[USING_SECOND_TOAST]) new_dp[USED_SECOND_TOAST] = max(new_dp[USED_SECOND_TOAST], a + dp[USING_SECOND_TOAST]) if dp[USED_SECOND_TOAST] >= 0: new_dp[USED_SECOND_TOAST] = max(new_dp[USED_SECOND_TOAST], a + dp[USED_SECOND_TOAST]) dp = new_dp print(max(dp)) if __name__ == "__main__": main()