어렵지 않은 DP 문제입니다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <utility>
#include <string.h>
#include <math.h>
#define MAX 99999999
#pragma warning(disable:4996)
using namespace std;
int n,ddr[100001], dp[5][5][100001];
int from_to(int p1, int p2)
{
if (p1 == 0)
return 2;
if (abs(p1 - p2) == 2)
return 4;
return 3;
}
int moving(int pre, int next, int cur)
{
if (ddr[cur] == 0)
return 0;
int& ret = dp[pre][next][cur];
if (ret)
return ret;
if (next == ddr[cur] || pre == ddr[cur])
ret = moving(pre, next, cur + 1) + 1;
else
{
ret = from_to(pre, ddr[cur]) + moving(ddr[cur], next, cur + 1);
ret = min(ret, from_to(next, ddr[cur]) + moving(pre, ddr[cur], cur + 1));
}
return ret;
}
int main()
{
n = 0;
while (1)
{
scanf("%d", &ddr[n++]);
if (ddr[n - 1] == 0)
break;
}
printf("%d", moving(0, 0, 0));
}'IT > BOJ' 카테고리의 다른 글
| 백준(BOJ) 2159 케익 배달 ** (0) | 2018.06.01 |
|---|---|
| 백준(BOJ) 1727 커플 만들기 ** (0) | 2018.06.01 |
| 백준(BOJ) 11062 카드게임 *** (0) | 2018.06.01 |
| 백준(BOJ) 2932 표회전 * (0) | 2018.06.01 |
| 백준(BOJ) 2098 외판원 순회 ** (0) | 2018.06.01 |