-
[14852] 타일 채우기 3BOJ 2021. 11. 19. 00:46
https://www.acmicpc.net/problem/14852
14852번: 타일 채우기 3
첫째 줄에 경우의 수를 1,000,000,007로 나눈 나머지를 출력한다.
www.acmicpc.net
<문제>
점화식을 설계하는 난이도도 있지만, 이를 (TLE 안나오게) 잘 구현하는 난이도도 있다.
dp[i] = 3 * dp[i - 2] + 2 * dp[i - 1];
여기까지는 간단하게 생각할 수 있지만, n>=3일때마다 고유한 모양이 나타난다.
해당 부분을 단순하게 구현하면 TLE를 피할 수 없으므로, dp[n]으로 구하던 것을 2차원으로 바꾸어,
고유한 모양을 dp[n][1], 전체를 dp[n][0]에 넣어준다.
<소스코드>
12345678910111213141516171819#include <bits/stdc++.h>using namespace std;using ll = long long;const int MOD = 1e9 + 7;ll n, dp[1000001][2];int main(void) {cin >> n;dp[0][0] = 0;dp[1][0] = 2;dp[2][0] = 7;dp[2][1] = 1;int i;for (i = 3; i <= n; i++) {dp[i][1] = (dp[i - 1][1] + dp[i - 3][0]) % MOD;dp[i][0] = (3 * dp[i - 2][0] + 2 * dp[i - 1][0] + 2 * dp[i][1]) % MOD;}cout << dp[n][0] % MOD;return 0;}cs 'BOJ' 카테고리의 다른 글
[1015] 수열 정렬 (0) 2021.11.27 [18429] 근손실 (0) 2021.11.27 [14889] 스타트와 링크 (0) 2021.11.18 [14465] 소가 길을 건너간 이유 5 (0) 2021.11.18 [13977] 이항 계수와 쿼리 (0) 2021.11.18