Study hard

(c++)백준 12026번: BOJ거리 본문

백준/DP

(c++)백준 12026번: BOJ거리

Nimgnoej 2020. 9. 18. 22:14

www.acmicpc.net/problem/12026

 

12026번: BOJ 거리

스타트가 링크를 만나는데 필요한 에너지 양의 최솟값을 출력한다. 만약, 스타트가 링크를 만날 수 없는 경우에는 -1을 출력한다.

www.acmicpc.net

[풀이]

DP를 이용하여 풀 수 있는 문제였다.

DP[i] : i번째 칸까지 가는데에 필요한 에너지 양의 최솟값

점화식

DP[j] = min(DP[j], (j-i)*(j-i)+DP[i])

 

#include <iostream>
#include <algorithm>//min, fill
using namespace std;

int N;
char street[1001];
int DP[1001];

void solution() {
	DP[1] = 0;
	for (int i = 1; i < N; i++) {
		if (street[i] == 'B') {
			for (int j = i + 1; j <= N; j++) {
				if (street[j] == 'O')
					DP[j] = min(DP[j], (j - i)*(j - i) + DP[i]);
			}
		}
		else if (street[i] == 'O') {
			for (int j = i + 1; j <= N; j++) {
				if (street[j] == 'J')
					DP[j] = min(DP[j], (j - i)*(j - i) + DP[i]);
			}
		}
		else {
			for (int j = i + 1; j <= N; j++) {
				if (street[j] == 'B')
					DP[j] = min(DP[j], (j - i)*(j - i) + DP[i]);
			}
		}
	}
	if (DP[N] == 9999999)
		cout << -1 << '\n';
	else
		cout << DP[N] << '\n';
}

int main() {
	cin >> N;
	for (int i = 1; i <= N; i++) {
		cin >> street[i];
	}
	fill(DP, DP + 1001, 9999999);
	solution();
	return 0;
}

 

※변수 이름 BOJ로 하면 에러

'백준 > DP' 카테고리의 다른 글

(c++)백준 2281번: 데스노트  (0) 2020.09.19
(c++)백준 12996번: Acka  (0) 2020.09.19
(c++)백준 14238번: 출근 기록  (0) 2020.09.18
(c++)백준 5557번: 1학년  (0) 2020.09.18
(c++)백준 11049번: 행렬 곱셈 순서  (0) 2020.09.16