Study hard
(c++)백준 12869번: 뮤탈리스크 본문
12869번: 뮤탈리스크
1, 3, 2 순서대로 공격을 하면, 남은 체력은 (12-9, 10-1, 4-3) = (3, 9, 1)이다. 2, 1, 3 순서대로 공격을 하면, 남은 체력은 (0, 0, 0)이다.
www.acmicpc.net
[풀이]
재귀 DP로 풀 수 있는 문제였다.
DP[x][y][z] : 체력이 각각 x,y,z인 SCV 파괴하기 위한 공격 횟수의 최솟값
해당 SCV가 없거나 파괴되었으면 0으로 두고 풀면 된다.
#include <iostream>
#include <algorithm>//min
#include <cstring>//memset
using namespace std;
int N;
int DP[61][61][61];
int HP[3] = { 0, };//SCV없으면 그냥 0
int solution(int x, int y, int z) {
//파괴된 SCV가 있을 경우
if (x < 0)return solution(0, y, z);
if (y < 0)return solution(x, 0, z);
if (z < 0)return solution(x, y, 0);
//모든 SCV가 파괴된 경우
if (x == 0 && y == 0 && z == 0)
return 0;
int& res = DP[x][y][z];
//이미 구해둔 값이면
if (res != -1)
return res;
res = 99999999;
res = min(res, solution(x - 9, y - 3, z - 1) + 1);
res = min(res, solution(x - 9, y - 1, z - 3) + 1);
res = min(res, solution(x - 3, y - 9, z - 1) + 1);
res = min(res, solution(x - 1, y - 9, z - 3) + 1);
res = min(res, solution(x - 3, y - 1, z - 9) + 1);
res = min(res, solution(x - 1, y - 3, z - 9) + 1);
return res;
}
int main() {
cin >> N;
memset(DP, -1, sizeof(DP));
for (int i = 0; i < N; i++) {
cin >> HP[i];
}
cout << solution(HP[0], HP[1], HP[2]) << '\n';
return 0;
}
'백준 > DP' 카테고리의 다른 글
(c++)백준 2293번: 동전 1 (0) | 2020.09.16 |
---|---|
(c++)백준 10422번: 괄호 (0) | 2020.09.16 |
(c++)백준 1459번: 기타리스트 (0) | 2020.09.15 |
(c++)백준 12865번: 평범한 배낭 (0) | 2020.09.15 |
(c++)백준 11066번: 파일 합치기 (0) | 2020.09.15 |