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;
}
'๐๏ธ ICPC Sinchon > Dynamic Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 2421๋ฒ: ์ ๊ธํต (0) | 2024.09.24 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 2313๋ฒ: ๋ณด์ ๊ตฌ๋งคํ๊ธฐ (0) | 2024.09.23 |
[BOJ][C++] ๋ฐฑ์ค 4883๋ฒ: ์ผ๊ฐ ๊ทธ๋ํ (0) | 2024.09.13 |
[BOJ][C++] ๋ฐฑ์ค 2688๋ฒ: ์ค์ด๋ค์ง ์์ (0) | 2024.09.06 |
[BOJ][C++] ๋ฐฑ์ค 1904๋ฒ: 01ํ์ผ (0) | 2024.08.25 |