문제풀이/백준

[C++]백준 12869 - 뮤탈리스크

레옹 2022. 1. 10. 23:01

https://www.acmicpc.net/problem/12869

 

12869번: 뮤탈리스크

1, 3, 2 순서대로 공격을 하면, 남은 체력은 (12-9, 10-1, 4-3) = (3, 9, 1)이다. 2, 1, 3 순서대로 공격을 하면, 남은 체력은 (0, 0, 0)이다.

www.acmicpc.net

 

풀이


DP로 푸는 문제다.

모든 경우의 수를 탐색해서 제일 빨리 SCV를 다 처치하는 경우를 찾는다

코드


#include <iostream>
#include <queue>
#include <memory.h>
#include <string>
#include <vector>
#include <math.h>
using namespace std;
#define MAX 987432
int N;
int SCVHP[4];
int SCV[61][61][61];

int n = 0;
void Mutalisk(int scv1HP,int scv2HP, int scv3HP,int count) {
	if (SCV[scv1HP][scv2HP][scv3HP] <= count)
		return;

	SCV[scv1HP][scv2HP][scv3HP] = count;
	if (scv1HP == 0 && scv2HP == 0 && scv3HP == 0)
		return;
	
	Mutalisk(max(scv1HP - 9, 0), max(scv2HP - 3, 0), max(scv3HP - 1, 0), count + 1);
	Mutalisk(max(scv1HP - 9, 0), max(scv2HP - 1, 0), max(scv3HP - 3, 0), count + 1);
	Mutalisk(max(scv1HP - 3, 0), max(scv2HP - 9, 0), max(scv3HP - 1, 0), count + 1);
	Mutalisk(max(scv1HP - 1, 0), max(scv2HP - 9, 0), max(scv3HP - 3, 0), count + 1);
	Mutalisk(max(scv1HP - 3, 0), max(scv2HP - 1, 0), max(scv3HP - 9, 0), count + 1);
	Mutalisk(max(scv1HP - 1, 0), max(scv2HP - 3, 0), max(scv3HP - 9, 0), count + 1);
	return;
}
int main() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> SCVHP[i];
	}
	
	memset(SCV, MAX, sizeof(SCV));;
	Mutalisk(SCVHP[0], SCVHP[1], SCVHP[2], 0);
	cout << SCV[0][0][0] << endl ;
	return 0;
}