본문 바로가기
IT/BOJ

백준(BOJ) 2449 전구 ***

by 빨강자몽 2018. 6. 1.

음 ..... DP로 분류되어있지만...

사실 재귀에서 메모라이징 기법을 사용한 문제에 가까운 것 같다.


DP[i][j] = i~j까지 전구의 최소 변환 횟수

다른 방식은 떠오르지가 않는다....


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <math.h>
#include <queue>
#include <set>
#include <list>
#include <utility>
#include <functional>
#define MAX 205
#define INF 987654321
#define MOD 1000000
#pragma warning(disable:4996)
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;

int n, m, arr[MAX], dp[MAX][MAX];

int fun(int s, int f)
{
	if (s == f)
		return 0;
	if (dp[s][f] != -1)
		return dp[s][f];
	// 이전에 s~f 범위 전구의 스위치 변환 횟수를 구했다면
	dp[s][f] = INF;
	for (int i = s; i < f; i++)
	{
		int tmp = arr[s] != arr[i + 1]? 1: 0;
		dp[s][f] = min(dp[s][f], fun(s, i) + fun(i + 1, f) + tmp);
		// s~f전구의 최소 변횐 횟수 = s~i, i+1~f 전구의 최소 변환 횟수 + tmp
	}
	return dp[s][f];
}

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
		scanf("%d", &arr[i]);
	memset(dp, -1, sizeof(dp));
	printf("%d",fun(1,n));
	return 0;
}


'IT > BOJ' 카테고리의 다른 글

백준(BOJ) 11726 2*n 타일링 **  (0) 2018.06.01
백준(BOJ) 11084 나이트의 염탐 **  (0) 2018.06.01
백준(BOJ) 1026 보물섬 **  (0) 2018.06.01
백준(BOJ) 2294 동전 2 **  (0) 2018.06.01
백준(BOJ) 2159 케익 배달 **  (0) 2018.06.01