[문제]
https://www.acmicpc.net/problem/11727
[접근법]
- 다이나밍프로그래밍이란걸 보자마자 느낌..!
- 점화식을 찾아내기 위해 애썼음
[문제풀이]
- 고민하다가 찾은 점화식은
//홀수인경우
if (i % 2 != 0) {
memo[i] = ((memo[i-1] * 2) - 1) % 10007;
}
else {
memo[i] = ((memo[i -1] * 2) + 1) % 10007;
}
- 근데 알고보니 원리가 따로있었다
- 경우의 수는 가로가1인 경우와, 가로가2인경우(2x2 사용하거나 2x1) 두가지이다.
- 가로가 1인 경우의 개수 + 가로가 2인경우의 개수 * 2를 한 값을 dp에 저장해 두면 되는거였음
- 이런식이라면 3n타일링도 금방 점화식을 찾을 수 있을것같다!
for(int i = 2; i < n; i++){ // 타일의 가로 길이 1 or 2 -> n-1, n-2 이용 / n-2의 경우의 수 2*1와 2*2, 2개 이므로 *2 필요
dp[i] = (dp[i-1] + ((dp[i-2]) * 2) % 10007) % 10007;
}
[전체코드]
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
|
#include <iostream>
using namespace std;
int memo[1001];
void dp(int n) {
for (int i = 2; i <= n; i++) {
//홀수인경우
if (i % 2 != 0) {
memo[i] = ((memo[i-1] * 2) - 1) % 10007;
}
else {
memo[i] = ((memo[i -1] * 2) + 1) % 10007;
}
}
}
int main() {
int n;
cin >> n;
memo[1] = 1; //1가지밖에 없음
dp(n);
//for(int i = 1; i<=n; i++)
cout << memo[n] % 10007;
return 0;
}
|
cs |
'📚 알고리즘 > DP(다이나믹 프로그래밍)' 카테고리의 다른 글
[알고리즘] 동적계획법 (0) | 2020.07.04 |
---|---|
[백준 11052] 카드구매하기_dp(c++) (0) | 2020.06.27 |
[백준 2096] 내려가기_dp(c++) (0) | 2020.06.14 |
[백준 11057] 오르막수_dp(c++) (0) | 2020.05.31 |
[백준 11048] 이동하기(c++) (0) | 2020.05.24 |