結果

問題 No.2889 Rusk
コンテスト
ユーザー LyricalMaestro
提出日時 2026-07-12 18:49:11
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 180 ms / 2,000 ms
+ 141µs
コード長 3,542 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 627 ms
コンパイル使用メモリ 95,984 KB
実行使用メモリ 146,196 KB
最終ジャッジ日時 2026-07-12 18:49:28
合計ジャッジ時間 12,292 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 52
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

## 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()
0