PS/LeetCode

1301. Number of Paths with Max Score - Streak 6

조금씩 차근차근 2025. 9. 19. 14:41

 

DP 로 최댓값을 유지하면 풀 수 있다.

 

근거: 해당 지점의 최댓값이 바뀌면, 이후는 반드시 그 최댓값 경로를 따라야 한다.
따라서, 비교적 간단하게 최적 부분 구조+중복 부분문제를 만족한다.

 

그럼 남은 문제는, " 의 처리를 어떻게 할 것인가?"이다.

그냥 초깃값을 매우 낮은 음수로 설정해두면 된다.
1만 * 9 = 최대 값 9만이니, 기본 값 초기화를 전부 -10억으로 해두면 벽을 뛰어넘는 값으로 잘못된 값을 리턴하기 어려워진다.

class Solution {

    public int[] pathsWithMaxScore(List<String> board) {
        int n = board.size();
        List<List<Pair>> dp = new ArrayList<>();
        for(int i = 0; i<n; i++){
            List<Pair> temp = new ArrayList<>();
            for(int j = 0; j<n; j++){
                temp.add(new Pair(-100000000, 0));
            }
            dp.add(temp);
        }
        dp.get(n-1).set(n-1, new Pair(0, 1));
        dp.get(0).set(0, new Pair(0, 0));

        for(int i = n-1; i>= 0; i--){
            for(int j = n-1; j >= 0; j--){
                char nowChar = board.get(i).charAt(j);
                if(nowChar == 'X') {
                    dp.get(i).set(j, new Pair(-1000000000, 0));
                    continue;
                }
                if(nowChar == 'S' || nowChar == 'E') nowChar = '0';
                int now = nowChar - '0';

                if (i + 1 < n){
                    set(i, j, i+1, j, now, board, dp);
                }

                if (j + 1 < n){
                    set(i, j, i, j+1, now, board, dp);
                }

                if(i + 1 < n && j + 1 < n){
                    set(i, j, i+1, j+1, now, board, dp);
                }
            }
        }
        Pair result = dp.get(0).get(0);
        return new int[]{result.value, (int) result.count};
    }

    private void set(int i, int j,int k, int l, int now, List<String> board, List<List<Pair>> dp){

        long MOD = 1000000007L;
        char beforeChar = board.get(k).charAt(l);
        if(beforeChar!='X'){
            Pair nowPair = dp.get(i).get(j);
            Pair beforePair = dp.get(k).get(l);
            if(nowPair.value < beforePair.value + now){
                dp.get(i).set(j, new Pair(beforePair.value + now, beforePair.count));
            }else if (nowPair.value == beforePair.value + now){
                dp.get(i).set(j, new Pair(nowPair.value, (nowPair.count + beforePair.count) % MOD));
            }
        }
    }
}

public class Pair {
    public int value;
    public long count;
    public Pair(int a, long b){
        this.value = a;
        this.count = b;
    }
}