R G B 3가지 색깔이 있는 보드게임 카드를 가지고 문제의 룰을 통해 얻을 수 있는 최대 점수를 구하는 문제
처음에 접근을 카드를 기준으로 접근을 한게 아닌, 정점을 기준으로 접근을 했더니 아니나 다를까 메모리가 터졌다.
문제의 접근을 현재 위치와 이번에 내는 카드를 기준으로 접근을 해야했다.
현재 카드를 기준으로 접근 할 수 있는 정점의 값을 기록해 모든 카드를 소모 할 때 까지 반복한다.
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <vector>
#include <string.h>
using namespace std;
const int MAX = 500;
const int CARD_MAX = 1000;
vector<pair<int, char>> adj[MAX + 1];
char card[CARD_MAX];
int costMap[CARD_MAX + 1][MAX + 1];
int n, m, k;
int max(int a, int b)
{
return a > b ? a : b;
}
int func(int turn, int point)
{
if (turn == n)
return 0;
int& res = costMap[turn][point];
if (res != -1)
return res;
res = 0;
for (auto vertex : adj[point])
{
int next = vertex.first;
res = max(res, func(turn + 1, next) + (vertex.second == card[turn] ? 10 : 0));
}
return res;
}
int main()
{
memset(costMap, -1, sizeof(costMap));
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf(" %c", &card[i]);
scanf("%d %d", &m, &k);
for (int i = 0; i < k; i++)
{
int x, y;
char color;
scanf("%d %d %c", &x, &y, &color);
adj[x].push_back(make_pair(y, color));
adj[y].push_back(make_pair(x, color));
}
printf("%d",func(0, 1));
return 0;
}
2019-01-31 10:00:00에 Tistory에서 작성되었습니다.