白駿9465号(Java)


DP
Javaで白俊9465号を解読しました.結局解けなかった.DPを殺したい
質問リンクを添付します.
https://www.acmicpc.net/problem/9465
DPを使用して各位置の最低価格を更新する

この原理で最後まで計算して、最後の列の上下2つの格の中でもっと大きいやつを出力すればいい.これを次のようにコードで表します.
Integer solution(){
        int[][] dp = new int[2][N+1];
        dp[0][1] = map[0][1];
        dp[1][1] = map[1][1];

        for(int i=2; i<=N; i++){
            dp[0][i] = Math.max(dp[1][i-2], dp[1][i-1]) + map[0][i];
            dp[1][i] = Math.max(dp[0][i-2], dp[0][i-1]) + map[1][i];
        }

        return Math.max(dp[0][N], dp[1][N]);
    }
コード全体を以下に示します.
import java.io.*;
import java.util.StringTokenizer;

public class boj9465 {
    static int T,N;
    static int[][] map;

    static Integer solution(){
        int[][] dp = new int[2][N+1];
        dp[0][1] = map[0][1];
        dp[1][1] = map[1][1];

        for(int i=2; i<=N; i++){
            dp[0][i] = Math.max(dp[1][i-2], dp[1][i-1]) + map[0][i];
            dp[1][i] = Math.max(dp[0][i-2], dp[0][i-1]) + map[1][i];
        }

        return Math.max(dp[0][N], dp[1][N]);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk;
        T = Integer.parseInt(bfr.readLine());

        for(int t=0; t<T; t++){
            N = Integer.parseInt(bfr.readLine());
            map = new int[2][N+1];
            for(int i=0; i<2; i++){
                stk = new StringTokenizer(bfr.readLine());
                for(int j=1; j<=N; j++){
                    map[i][j] = Integer.parseInt(stk.nextToken());
                }
            }
            System.out.println(solution());
        }
    }
}
このブログの解答を参照してください.
結果点火式...呜呜...あ…!!