プログマーズ通学路
2499 ワード
質問する
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で割って加算すればいいです.
Reference
この問題について(プログマーズ通学路), 我々は、より多くの情報をここで見つけました https://velog.io/@josajang98/등굣길テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol