그냥 하는 노트와 메모장

BOJ 12932 노래방 본문

Solved problems

BOJ 12932 노래방

coloredrabbit 2020. 6. 8. 20:43

BOJ 12932 노래방

[분류 : 다이나믹 프로그래밍]

 

[풀이]

  뭔가 간단한 문제.
  현재 p번째 노래를 누가 부를지 결정할 때 나올 수 있는 상태로 영선이가 마지막으로 부른 노래의 인덱스 i, 효빈이가 마지막으로 부른 노래의 인덱스 j가 있다.
  몇 번째 노래 해야하는 지(p)를 구할 땐 i와 j 중 큰 값에서 +1를 해주면 구할 수 있다.

 

rec(i, j) = min(rec(p, j) + "i와 p 노래 사이의 난이도", rec(i, p) + "j와 p 노래 사이의 난이도")

 

더보기
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX_N = 2e3 + 1;
int N, dp[MAX_N][MAX_N], A[MAX_N];
int rec(int a, int b) {
    if (a == N || b == N) return 0;
    int& ret = dp[a][b];
    if (ret != -1) return ret;
    int p = max(a, b) + 1;
    return ret = min(rec(p, b) + (a ? abs(A[a] - A[p]) : 0), rec(a, p) + (b ? abs(A[b] - A[p]) : 0));
}
int main() {
    memset(dp, -1, sizeof dp);
    scanf("%d", &N);
    for (int i = 1; i <= N; i++) scanf("%d", &A[i]);
    printf("%d", rec(0, 0));
    return 0;
}

'Solved problems' 카테고리의 다른 글

BOJ 10468 숫자뽑기게임  (0) 2020.06.09
BOJ 5042 나무 옮기기  (0) 2020.06.08
BOJ 12861 죄수에게 주는 뇌물  (0) 2020.06.08
BOJ 1023 괄호 문자열  (1) 2020.06.04
BOJ 17428 K번째 괄호 문자열  (0) 2020.06.04
Comments