티스토리 뷰

728x90

문제 링크

https://www.acmicpc.net/problem/15924


구사과씨가 어디서 출발할지 모른다. 따라서 각각의 모든 점에서 X까지 갈 수 있는 경우의 수를 모두 구해서 더해야 한다. 역으로 X에서부터 시작해 뒤쪽에서 앞쪽으로 올 수 있는 경우의 수를 저장하자.


d[i][j]=(i,j)에서 X까지 갈 수 있는 경로의 수

p[i][j]= 직사각형 지도에서 (i,j)의 정보 


{d[i1][j]=d[i1][j]+d[i][j], if  i10 and p[i1][j]='S' or 'B'd[i][j1]=d[i][j1]+d[i][j], if  j10 and p[i][j1]='E' or 'B'


점화식을 세웠으니 반복문을 돌리자. 연산할때마다 109+9로 나눠주는 것을 잊으면 안된다.



정답 코드

#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;
}
view raw 15924.cpp hosted with ❤ by GitHub





질문, 피드백 환영합니다.

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함