※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 24501번 문제인 blobaww이다.
문제는 아래 링크를 확인하자.

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

 

24501번: blobaww

주환이가 조건에 맞게 고를 수 있는 경우의 수를 $10^9+7$로 나눈 나머지를 출력한다.

www.acmicpc.net

맨 왼쪽 위에서부터 표를 읽으면서, 그 칸의 행과 열까지만을 포함하는 부분행렬에서 만들어질 수 있는 "E", "ES", "ESM"의 개수를 점화관계를 이용하여 계산해나가자.

 

지금 써져있는 문자가 E라면 이 칸까지의 E의 개수에 1을 하나 더하고, S라면 이 칸까지의 S의 개수에 "E의 개수"를 더하고, M이라면 이 칸까지의 M의 개수에 "S의 개수"를 더해주면 문제에서 요구하는 경우의 수를 구할 수 있다.

 

나머지 계산 처리에 주의하자.

 

아래는 제출한 소스코드이다.

#define MAX 1000000007
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;

string board[3000];
ll E[3000][3000];
ll S[3000][3000];
ll M[3000][3000];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int R, C; cin >> R >> C;
	for (int r = 0; r < R; r++) cin >> board[r];
	for (int r = 0; r < R; r++) {
		for (int c = 0; c < C; c++) {
			ll e1 = 0, e2 = 0, e3 = 0, s1 = 0, s2 = 0, s3 = 0, m1 = 0, m2 = 0, m3 = 0;
			if (r) e1 = E[r - 1][c], s1 = S[r - 1][c], m1 = M[r - 1][c];
			if (c) e2 = E[r][c - 1], s2 = S[r][c - 1], m2 = M[r][c - 1];
			if (r && c) e3 = E[r - 1][c - 1], s3 = S[r - 1][c - 1], m3 = M[r - 1][c - 1];
			E[r][c] = e1 + e2 - e3, S[r][c] = s1 + s2 - s3, M[r][c] = m1 + m2 - m3;
			if (board[r][c] == 'E') E[r][c]++;
			else if (board[r][c] == 'S') S[r][c] += E[r][c];
			else M[r][c] += S[r][c];
			E[r][c] %= MAX, S[r][c] %= MAX, M[r][c] %= MAX;
			if (E[r][c] < 0) E[r][c] += MAX;
			if (S[r][c] < 0) S[r][c] += MAX;
			if (M[r][c] < 0) M[r][c] += MAX;
		}
	}

	cout << M[R - 1][C - 1];
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 24503 // C++] blobfearful  (0) 2022.03.10
[BOJ 24502 // C++] blobsad  (0) 2022.03.09
[BOJ 24500 // C++] blobblush  (0) 2022.03.07
[BOJ 24499 // C++] blobyum  (0) 2022.03.06
[BOJ 24498 // C++] blobnom  (0) 2022.03.05

+ Recent posts