プログマーズ通学路


質問する


https://programmers.co.kr/learn/courses/30/lessons/42898#

コード#コード#


cpp

#include <string>
#include <vector>

#define N 1000000007
using namespace std;

int solution(int m, int n, vector<vector<int>> puddles) {
    int answer = 0;
    vector<vector<int>> dp(n,vector<int>(m,0));
        
    for(auto i: puddles)
        dp[i[1]-1][i[0]-1]=-1;
    
    dp[0][0]=1;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if((i==0&&j==0)||dp[i][j]==-1) continue;
            
            if(dp[i-1][j]==-1||i==0) dp[i][j]=dp[i][j-1];
            else if(dp[i][j-1]==-1||j==0) dp[i][j]=dp[i-1][j];
            else dp[i][j]=dp[i-1][j]%N+dp[i][j-1]%N;  
        }
    }
    answer=dp[n-1][m-1]%N;
    return answer;
}

python

def solution(m, n, puddles):
    answer = 0
    dp = [[0]*(m+1) for _ in range(n+1)]
    dp[1][1] = 1
    for x, y in puddles:
        dp[y][x] = -1
    for i in range(1, n+1):
        for j in range(1, m+1):
            if dp[i][j] == -1:
                dp[i][j] = 0
                continue
            if i == j == 1:
                continue
            dp[i][j] = dp[i-1][j]+dp[i][j-1]

    return dp[n][m]%1000000007

に答える


家の位置が(1,1)に固定され、学校の位置が(m,n)に固定されている場合、家から学校までの最短経路の数.個人的にはn、mの位置の変化は少し気分が悪いと思います.
家を出発して、右と下に移動するだけで、いつも最短の経路で、水たまりを例外的に処理すれば、問題は解決しにくくありません.
コードでは、ピットに-1とマークして異常処理を行い、1を(0,0)に入れ、ダブルfor文を使用してdpテーブルを迂回し、上にピットがある場合、またはiが0である場合、左の値をコピーし、左にピットがある場合、またはjが0である場合、上の値をコピーします.そうでなければ、上の値と左の値を1000000 7で割って加算すればいいです.