※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 27114번 문제인 조교의 맹연습이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/27114
27114번: 조교의 맹연습
첫 번째 줄에 각각 좌로 돌아, 우로 돌아, 뒤로 돌아에 들어가는 에너지를 나타내는 세 정수 $A, B, C$와 사용하고자 하는 총 에너지양을 나타내는 정수 $K$가 공백으로 구분되어 주어진다. $(1\leq A,B
www.acmicpc.net
dp[E][k]를 에너지를 E만큼 소비했을 때의 처음 시작자세에서 90k도 회전한 상태로 서있기 위한 최소 구령횟수로 정의하자. 이 때, 에너지를 E만큼 소비하고 처음 시작자세에서 90k도 회전한 상태가 되기 위해서는 마지막으로 "좌로 돌아", "우로 돌아" 또는 "뒤로 돌아" 셋 중 하나의 제식 수행을 하였을 것이므로, 이와 같은 관계를 이용해 dp에 관한 점화식을 세울 수 있음을 관찰할 수 있다.
위의 관찰로 얻을 수 있는 점화식과 메모이제이션을 이용해 문제를 해결해주자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int A, B, C, K;
int dp[2000001][4];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
dp[0][0] = 1;
cin >> A >> B >> C >> K;
for (int k = 0; k < K; k++) {
for (int d = 0; d < 4; d++) {
if (dp[k][d]) {
if (dp[k + A][(d + 3) % 4]) dp[k + A][(d + 3) % 4] = min(dp[k + A][(d + 3) % 4], dp[k][d] + 1);
else dp[k + A][(d + 3) % 4] = dp[k][d] + 1;
if (dp[k + B][(d + 1) % 4]) dp[k + B][(d + 1) % 4] = min(dp[k + B][(d + 1) % 4], dp[k][d] + 1);
else dp[k + B][(d + 1) % 4] = dp[k][d] + 1;
if (dp[k + C][(d + 2) % 4]) dp[k + C][(d + 2) % 4] = min(dp[k + C][(d + 2) % 4], dp[k][d] + 1);
else dp[k + C][(d + 2) % 4] = dp[k][d] + 1;
}
}
}
cout << dp[K][0] - 1;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 27115 // C++] 통신소 (0) | 2023.01.27 |
---|---|
[BOJ 27113 // C++] 잠입 (0) | 2023.01.26 |
[BOJ 25375 // C++] 아주 간단한 문제 (0) | 2023.01.26 |
[BOJ 27112 // C++] 시간 외 근무 멈춰! (0) | 2023.01.26 |
[BOJ 27111 // C++] 출입 기록 (0) | 2023.01.25 |