반응형
문제 출처 :
https://www.acmicpc.net/problem/1947
알고리즘 분석 :
문제 해결에 필요한 사항
1. Dynamic Programming
2. 점화식 세우는 방법
3. 완전순열
dp[i] :: i명의 사람이 선물을 나눌 수 있는 방법의 수
dp[1] = 0이고
dp[2] = 1임이 자명하다.
이제 dp[i] (i >= 3)에 대해 생각해보자.
이때 1번 사람은 항상 i번 사람의 선물을 가진다 가정하자.
이렇게 된다면 i번 사람은 2가지 경우를 가질 수 있게 된다.
1. n이 1번 선물을 선택할 경우
1번과 n번이 서로 교환한 상태이니 dp[n-2]가지 경우를 가질 수 있다.
2. n이 1번 선물을 선택하지 않을 경우
이때는 1번이 n번에게만 선물을 준 상태이니 결국 dp[n-1]가지 경우를 가질 수 있다.
이때 1,2번 모든 경우에서 1번 사람이 n번만을 선택할 경우만 생각했으나 1번은 n-1번 사람의 모자를 아무거나 선택해도 된다.
따라서 점화식 dp[n] = (n-1)(dp[n-1] + dp[n-2])가 성립된다.
소스 코드 :
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 | #include <iostream> #include <cstdio> using namespace std; const long long MOD = 1000000000; long long dp[1000002]; int main() { dp[1] = 0; dp[2] = 1; int n; cin >> n; for (int i = 3; i <= n; i++) dp[i] = (i - 1)*(dp[i - 2] + dp[i - 1]) % MOD; cout << dp[n]; return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1939번] 중량제한 (0) | 2018.01.04 |
---|---|
[2629번] 양팔저울 (0) | 2018.01.02 |
[1236번] 성 지키기 (0) | 2017.12.17 |
[10527번] Judging Troubles (0) | 2017.12.12 |
[2401번] 문자열 붙여넣기 (0) | 2017.12.12 |