문제 출처: https://www.acmicpc.net/problem/1633
Silver 2
(인데 체감 골드 5였다, 이유는 맨 밑에)
- 1000줄까지 입력 받을 수 있다.
- 흑백 누구든 선택해서 꾸릴 수 있고, 흑백 둘 중 아무도 선택하지 않을 수 있는 3가지 경우가 있다.
- 시간 초과를 막기 위해 메모제이션 사용
#include <iostream>
#include <cstdio>
using namespace std;
int player[1001][2];
int dp[1001][16][16];
int N;
int dfs(int idx, int white, int black) {
if (white == 15 && black == 15) return 0;
if (idx == N) return 0;
if (dp[idx][white][black]) return dp[idx][white][black];
int ans = 0;
if (white < 15) {
ans = dfs(idx+1, white + 1, black) + player[idx][0];
}
if (black < 15) {
ans = max(ans, dfs(idx + 1, white, black+1) + player[idx][1]);
}
return dp[idx][white][black] = max(ans, dfs(idx + 1, white, black));
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int idx = 0;
int w, b;
while (scanf("%d %d", &w, &b) == 2) {
player[idx][0] = w;
player[idx++][1] = b;
}
N = idx;
cout << dfs(0,0,0) << "\n";
return 0;
}
왜 체감상 난이도가 더 높은 거 같았냐면, 일단 문제가 이해 안갔다. 그리고 N값이 주어지지 않아 입력을 계속 받아야하는데 VS 2017에서 계속 입력 받아져서 결과값이 안나왔다.
그래서 입력값 받는 부분에서 시간 걸리고ㅋㅋㅋ 그리고 계속 틀렸습니다 떠서 멘붕이었다가 별거 다 시도하다가 배열값 16으로 하니깐 해결됐다. 허탈!
혹시 작성하신 코드 관련해서 질문 드려도 될까요?