정리와기록 블로그
[10835] 카드게임 본문
문제: https://www.acmicpc.net/problem/10835
10835번: 카드게임
첫 줄에는 한 더미의 카드의 개수를 나타내는 자연수 N(1 ≤ N ≤ 2,000)이 주어진다. 다음 줄에는 왼쪽 더미의 카드에 적힌 정수 A(1 ≤ A ≤ 2,000)가 카드 순서대로 N개 주어진다. 그 다음 줄에는 오��
www.acmicpc.net
접근:
- 점수를 위해서는 모두 버리는 것보다 오른쪽 카드 더미를 버리는 행위를 선택해야 합니다.
- 오른쪽 카드가 더 크다면, 왼쪽 카드만 버리거나 모두 버리는 것 중 큰 결과를 갖는 행위를 선택합니다.
- 카드 인덱스로 위 행위를 재귀 함수화하면, 중복되는 경우들이 있기 때문에 동적할당법을 사용합니다. (2000*2000)
코드:
#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
int N;
int L[2000], R[2000];
int cache[2000][2000]; // 캐시
// i = 왼쪽 카드 더미 인덱스
// j = 오른쪽 카드 더미 인덱스
int findMax(int i, int j)
{
if (i >= N || j >= N) return 0; // 하나라도 끝나면 종료한다.
int& ret = cache[i][j];
if (ret != -1) { return ret; }
if (L[i] > R[j]) return ret = R[j] + findMax(i, j + 1);
else return ret = max(findMax(i + 1, j + 1), findMax(i + 1, j)); // 모두 버리거나, 왼쪽만 버리기
}
int main()
{
memset(cache, -1, sizeof(cache));
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> L[i];
}
for (int i = 0; i < N; i++)
{
cin >> R[i];
}
cout << findMax(0, 0) << "\n";
return 0;
}
'BOJ > 동적계획법' 카테고리의 다른 글
[12865] 평범한 배낭 (0) | 2020.09.19 |
---|---|
[1890] 점프 (0) | 2020.04.04 |
[10942] 팰린드롬? (0) | 2020.04.04 |
[11055] 가장 큰 증가 부분 수열 (0) | 2020.03.07 |
[14002] 가장 긴 증가하는 부분 수열 4 (0) | 2020.03.07 |
Comments