티스토리 뷰
728x90
문제 링크
https://www.acmicpc.net/problem/15924
구사과씨가 어디서 출발할지 모른다. 따라서 각각의 모든 점에서 X까지 갈 수 있는 경우의 수를 모두 구해서 더해야 한다. 역으로 X에서부터 시작해 뒤쪽에서 앞쪽으로 올 수 있는 경우의 수를 저장하자.
d[i][j]=(i,j)에서 X까지 갈 수 있는 경로의 수
p[i][j]= 직사각형 지도에서 (i,j)의 정보
{d[i−1][j]=d[i−1][j]+d[i][j], if i−1≥0 and p[i−1][j]='S' or 'B'd[i][j−1]=d[i][j−1]+d[i][j], if j−1≥0 and p[i][j−1]='E' or 'B'
점화식을 세웠으니 반복문을 돌리자. 연산할때마다 109+9로 나눠주는 것을 잊으면 안된다.
정답 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <string> | |
using namespace std; | |
const int MOD = 1000000009; | |
int n, m, d[3001][3001]; | |
string p[3001]; | |
int main() { | |
ios_base::sync_with_stdio(false); | |
cin.tie(0); | |
cin >> n >> m; | |
for (int i = 0; i < n; i++) | |
cin >> p[i]; | |
d[n - 1][m - 1] = 1; | |
int ans = 0; | |
for (int i = n - 1; i >= 0; i--) { | |
for (int j = m - 1; j >= 0; j--) { | |
ans += d[i][j] % MOD; // d[i][j]는 이미 구했으므로 바로 답에 더해준다 | |
ans %= MOD; | |
if (i - 1 >= 0 && (p[i - 1][j] == 'S' || p[i-1][j] == 'B')) { | |
d[i - 1][j] += d[i][j] %MOD; | |
d[i - 1][j] %= MOD; | |
} | |
if (j - 1 >= 0 && (p[i][j - 1] == 'E' || p[i][j - 1] == 'B')) { | |
d[i][j - 1] += d[i][j]%MOD; | |
d[i][j - 1] %= MOD; | |
} | |
} | |
} | |
cout << ans; | |
} |
질문, 피드백 환영합니다.
728x90
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[BOJ] 백준 15926 현욱은 괄호왕이야!! (2) | 2018.07.25 |
---|---|
[BOJ] 백준 15925 욱제는 정치쟁이야!! (2) | 2018.07.25 |
[BOJ] 백준 15922 아우으 우아으이야!! (0) | 2018.07.25 |
[BOJ] 백준 15921 수찬은 마린보이야!! (0) | 2018.07.25 |
[BOJ] 백준 15920 선로에 마네킹이야!! (0) | 2018.07.25 |