페이지

9520번: NP-hard

https://www.acmicpc.net/problem/9520


$O(n^2)$

문제에 주어진 조건대로 탐사하려면 a1 > a2 > ... > ak-1 > ak < ak+1 <... < an-1 < an과 같이 방문해야 한다.
dp[i][j]: ...(결정) > i > ...(미결정) < j < ...(결정)과 같이 방문할 때 드는 시간의 최솟값

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX_N = 1500;
int n, w[MAX_N][MAX_N], dp[MAX_N][MAX_N];
int f(int x, int y) {
    if (y == n - 1 || dp[x][y]) return dp[x][y];
    return dp[x][y] = min(f(x, y + 1) + w[y][y + 1], f(y, y + 1) + w[x][y + 1]);
}
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) scanf("%d", &w[i][j]);
    printf("%d", f(0, 1) + w[0][1]);
    return 0;
}

댓글 2개 :

  1. 여기서 f()의 정의가 어떻게 되는 지 궁금합니다...

    답글삭제
    답글
    1. 설명에 정의를 추가했습니다.
      koi 경찰차 문제와 비슷하니 대회풀이를 참고하면 이해하는데 도움될 것 같습니다.

      삭제