[BOJ][C++] λ°±μ€ 1577λ²: λλ‘μ κ°μ
https://www.acmicpc.net/problem/1577
λ¬Έμ
μΈμ€μ΄κ° μ΄κ³ μλ λμλ μ κΈ°νκ² μκ²Όλ€. μ΄ λμλ 격μννλ‘ μκ²Όκ³ , μ§μ¬κ°νμ΄λ€. λμμ κ°λ‘ ν¬κΈ°λ Nμ΄κ³ , μΈλ‘ ν¬κΈ°λ Mμ΄λ€. λ, μΈμ€μ΄μ μ§μ (0, 0)μ μκ³ , μΈμ€μ΄μ νκ΅λ (N, M)μ μλ€.
λ°λΌμ, μλ κ·Έλ¦Όκ³Ό κ°μ΄ μκ²Όλ€.

μΈμ€μ΄λ μ§μμ νκ΅λ‘ κ°λ κΈΈμ κ²½μ°μ μκ° μ΄ λͺ κ°κ° μλμ§ κΆκΈν΄μ§κΈ° μμνλ€.
μΈμ€μ΄λ νμ μ΅λ¨κ±°λ¦¬λ‘λ§ κ°κΈ° λλ¬Έμ, νμ λλ‘λ₯Ό μ ννκ² N + Mκ° κ±°μΉλ€. νμ§λ§, μ΅κ·Ό λ€μ΄ μ΄ λμμ λλ‘κ° λΆμ€κ³΅μ¬ μνΉμΌλ‘ 곡μ¬μ€μΈ κ³³μ΄ μλ€. λλ‘κ° κ³΅μ¬ μ€μΌ λλ, μ΄ λλ‘λ₯Ό μ§λ μ μλ€.
(0, 0)μμ (N, M)κΉμ§ κ°λ μλ‘ λ€λ₯Έ κ²½λ‘μ κ²½μ°μ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫째 μ€μ λλ‘μ κ°λ‘ ν¬κΈ° Nκ³Ό μΈλ‘ ν¬κΈ° Mμ΄ μ£Όμ΄μ§λ€. Nκ³Ό Mμ 100λ³΄λ€ μκ±°λ κ°μ μμ°μμ΄κ³ , λμ§Έ μ€μλ 곡μ¬μ€μΈ λλ‘μ κ°μ Kκ° μ£Όμ΄μ§λ€. Kλ 0λ³΄λ€ ν¬κ±°λ κ°κ³ , 50λ³΄λ€ μκ±°λ κ°μ μμ°μμ΄λ€. μ μ§Έ μ€λΆν° Kκ° μ€μλ 곡μ¬μ€μΈ λλ‘μ μ λ³΄κ° a b c dμ κ°μ΄ μ£Όμ΄μ§λ€. aμ cλ 0λ³΄λ€ ν¬κ±°λ κ°κ³ , Nλ³΄λ€ μκ±°λ κ°μ μμ°μμ΄κ³ , bμ dλ 0λ³΄λ€ ν¬κ±°λ κ°κ³ , Mλ³΄λ€ μκ±°λ κ°μ μμ°μμ΄λ€. κ·Έλ¦¬κ³ , (a, b)μ (c, d)μ 거리λ νμ 1μ΄λ€.
μΆλ ₯
첫째 μ€μ (0, 0)μμ (N, M)κΉμ§ κ°λ κ²½μ°μ μλ₯Ό μΆλ ₯νλ€. μ΄ κ°μ 0λ³΄λ€ ν¬κ±°λ κ°κ³ , 263-1λ³΄λ€ μκ±°λ κ°μ μμ°μμ΄λ€.
νμ΄
dp[i][j] : (i,j) κΉμ§ κ°λ μ΅λ¨ κ²½λ‘μ κ°―μ
dp[i][j] = dp[i-1][j] + dp[i][j-1]
λ€μ΄λλ―Ή νλ‘κ·Έλλ° κΈ°λ³Έ λ¬Έμ
μ΄ λ¬Έμ μ μμ μ μ§λκ° μ μλ λλ‘μ μ‘΄μ¬λ₯Ό μ΄λ»κ² λ°μνλλλ€.
κ·Έλ¦¬κ³ μ΄ λλ‘μ λν μ 보λ₯Ό μμμ κ³Ό λμ°©μ μ΄λΌλ κ΄΄μν λ°©μμΌλ‘ μ λ ₯μ λ°λλ€
νμλ road[i][j][] ννμ μΌμ€λ°°μ΄λ‘ λλ‘λ₯Ό μ§λ μ μλμ§μ μ¬λΆλ₯Ό λ£μ΄λλ€
road[i][j][0] = (i-1, j)μμ (i,j)λ‘ κ° μ μλμ§ μ¬λΆ => μΈλ‘(μλμͺ½ λ°©ν₯) λλ‘
road[i][j][1] = (i, j-1)μμ (i,j)λ‘ κ° μ μλμ§ μ¬λΆ => κ°λ‘(μ€λ₯Έμͺ½ λ°©ν₯) λλ‘
κ·Έλ¦¬κ³ μ λ ₯μ μμμ κ³Ό λμ°©μ μ μμΉμ μμλ₯Ό λ°λ‘ μ ν΄μ μ£Όλκ² μλκΈ° λλ¬Έμ
곡μ¬μ€μΈ λλ‘ μ 보λ₯Ό μ λ ₯ λ°μμ μμμ κ³Ό λμ°©μ μ λͺ νν νκ³
λ°©κΈ λ°μ λλ‘κ° road[i][j][0] μΈμ§ road[i][j][1]μΈμ§ μ νμν΄μΌνλ€
for(int i=0; i<k; i++) {
int a,b,c,d;
cin >> a >> b >> c >> d;
if(a*100+b > c*100+d) {
int tmp;
tmp=a; a=c; c=tmp;
tmp=b; b=d; d=tmp;
}
if(a==c) {
road[c][d][1] = false;
} else {
road[c][d][0] = false;
}
}
μ λ ₯μ΄ μ λμλ€λ©΄ μ΄ν dp νμ΄λ μ½λ€.
κΈ°λ³Έμ μΌλ‘ dp[i][j] = dp[i-1][j] + dp[i][j-1] μ§λ§
μμμ μ€λ λλ‘κ° λ§νλ€λ©΄ dp[i-1][j]λ₯Ό λνμ§ μκ³
μΌμͺ½μμ μ€λ λλ‘κ° λ§νλ€λ©΄ dp[i][j-1]λ₯Ό λνμ§ μμΌλ©΄ λλ€.
// Dp νμ΄
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(road[i][j][0]) {
dp[i][j] += dp[i-1][j];
}
if(road[i][j][1]) {
dp[i][j] += dp[i][j-1];
}
}
}
μ½λ
//νμ΄ : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
using namespace std;
typedef pair<int, int> ci;
typedef long long ll;
const int INF = 101;
bool road[INF][INF][2];
int main() {
// road μ΄κΈ°ν
for(int i=0; i<INF; i++) {
for(int j=0; j<INF; j++) {
road[i][j][0] = true;
road[i][j][1] = true;
}
}
// μ
λ ₯
int n, m, k;
cin >> n >> m >> k;
for(int i=0; i<k; i++) {
int a,b,c,d;
cin >> a >> b >> c >> d;
if(a*100+b > c*100+d) {
int tmp;
tmp=a; a=c; c=tmp;
tmp=b; b=d; d=tmp;
}
if(a==c) {
road[c][d][1] = false;
} else {
road[c][d][0] = false;
}
}
// dp μ΄κΈ°ν
vector<vector<ll>>dp(n+1, vector<ll>(m+1, 0));
dp[0][0] = 1;
for(int i=1; i<=n; i++) {
if(road[i][0][0]) {
dp[i][0] = 1;
} else {
break;
}
}
for(int j=1; j<=m; j++) {
if(road[0][j][1]) {
dp[0][j] = 1;
} else {
break;
}
}
// Dp νμ΄
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(road[i][j][0]) {
dp[i][j] += dp[i-1][j];
}
if(road[i][j][1]) {
dp[i][j] += dp[i][j-1];
}
}
}
// μΆλ ₯
cout << dp[n][m];
return 0;
}