-
[BOJ] 14606 피자 (Small) - C++개발/알고리즘 & PS 2024. 3. 29. 14:08
https://www.acmicpc.net/problem/14606
14606번: 피자 (Small)
예제1의 입력이 1이므로, 게임 시작부터 갑이 분리할 수 있는 피자탑이 없습니다. 따라서 갑이 얻는 즐거움은 0입니다. 예제2의 정답 3은 다음과 같은 과정을 통해 얻어집니다. 먼저 놀이를 시작
www.acmicpc.net
아이디어
$n$개의 피자탑을 쪼갰을 때 가장 큰 즐거움을 얻으려면 짝수의 경우 $\frac{n}{2}$개, 홀수의 경우 $\frac{n}{2}$, $\frac{n}{2} + 1$개로 쪼개야 한다. 그리고 쪼개진 피자탑을 다시 쪼개서 $1$개가 될 때까지 얻을 수 있는 즐거움을 모두 더해주면 $n$개의 피자탑을 쪼갰을 때 얻을 수 있는 최대의 즐거움이다.
$n$개의 피자탑을 쪼개 얻을 수 있는 즐거움을 $A_n$이라고 하면
1. $n$이 짝수일 때 :
$$A_{n} = \big(\frac{n}{2}\big)^2 + 2A_{\frac{n}{2}}$$
2. $n$이 홀수일 때 :
$$A_{n} = \frac{n}{2}\big(\frac{n}{2} + 1\big) + A_{\frac{n}{2}} + A_{\frac{n}{2} + 1}$$
이다. dp를 통해 구현할 수 있다.
코드
#include <iostream> using namespace std; int main() { cin.tie(nullptr); cout.tie(nullptr); ios_base::sync_with_stdio(false); int n; cin >> n; int dp[n + 1]; dp[0] = 0; dp[1] = 0; for (int i = 2; i <= n; i++) { if (i % 2 == 0) dp[i] = dp[i / 2] + dp[i / 2] + (i / 2) * (i / 2); else dp[i] = dp[i / 2] + dp[i / 2 + 1] + (i / 2) * (i / 2 + 1); } cout << dp[n]; }
'개발 > 알고리즘 & PS' 카테고리의 다른 글
[BOJ] 11508 2+1 세일 - C++ (0) 2024.04.01 [BOJ] 20153 영웅이는 2의 거듭 제곱을 좋아해! - C++ (0) 2024.03.29 [BOJ] 17532 여러분의 다리가 되어 드리겠습니다! - C++ (0) 2024.01.13 [백준] 16985번 Maaaaaaaaaze C++ (3) 2023.10.19 [백준] 1062 가르침 C++ (2) 2023.10.18