정리와기록 블로그

[10835] 카드게임 본문

BOJ/동적계획법

[10835] 카드게임

뫂림 2020. 9. 1. 06:58

문제: 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