https://www.acmicpc.net/problem/15991
정수 N을 만드는 방법의 수를 구하는 문제인데 이 문제는 식이 대칭을 이루어야 합니다.
예를들어 N = 4일 때 1+1+1+1, 1+2+1, 2+2 이런 식은 가능하지만
1+1+2, 2+1+1, 1+3, 3+1 이런 식은 대칭을 이루지 않아 안된다는 점입니다.
대칭이라는 점을 이용하여,
N - 2를 이루는 식의 양 옆에 1씩 더하는 경우,
N - 4를 이루는 식의 양 옆에 2씩 더하는 경우,
N - 6을 이루는 식의 양 옆에 3씩 더하는 경우를
모두 더해주면 되겠습니다.
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 31 32 | #include <iostream> #define MOD 1000000009 using namespace std; int dp[100001]; void init() { dp[0] = 1; dp[1] = 1; dp[2] = 2; dp[3] = 2; dp[4] = 3; dp[5] = 3; for (int i = 6; i <= 100000; i++) { dp[i] = ((dp[i - 2] + dp[i - 4]) % MOD + dp[i - 6]) % MOD; } } int main() { cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false); init(); int tc, N; cin >> tc; while (tc--) { cin >> N; cout << dp[N] << '\n'; } return 0; } | cs |
'algorithm > dp' 카테고리의 다른 글
boj 15993 1, 2, 3 더하기 8 (0) | 2021.01.22 |
---|---|
boj 15992 1, 2, 3 더하기 7 (0) | 2021.01.22 |
boj 15990 1, 2, 3 더하기 5 (0) | 2021.01.22 |
boj 15989 1, 2, 3 더하기 4 (0) | 2021.01.22 |
boj 15988 1, 2, 3 더하기 3 (0) | 2021.01.22 |