dp문제.


A위치에서 다리 K개를 건넜을 때 도착할 수 있는 섬의 높이 중에 가장 작은값을 출력하면 된다.


d[x][c] = 현재 위치가 x이고 c개의 다리를 더 건널 수 있을 때 도달가능한 가장 낮은 높이.



<코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
 
int n, m, t, a[101], s, k, d[101][501];
vector<int> v[101];
 
int dfs(int x, int c) {
    if (d[x][c] != -1return d[x][c];
    if (!c) return a[x];
    d[x][c] = 2e9;
    for (auto i : v[x]) d[x][c] = min(d[x][c], dfs(i, c - 1));
    return d[x][c];
}
 
int main() {
    memset(d, -1sizeof(d));
    scanf("%d%d"&n, &m);
    for (int i = 1; i <= n; i++scanf("%d"&a[i]);
    while (m--) {
        int b, c;
        scanf("%d%d"&b, &c);
        v[b].push_back(c);
        v[c].push_back(b);
    }
    scanf("%d"&t);
    while (t--) {
        scanf("%d%d"&s, &k);
        // s위치에 간선이 존재하지 않는다면 k(>=1)번 움직이는게 불가능하다
        printf("%d\n", v[s].size() ? dfs(s, k) : -1);
    }
    return 0;
}
cs


'BOJ' 카테고리의 다른 글

1884 고속도로  (0) 2017.08.31
10025 게으른 백곰  (0) 2017.08.30
11664 선분과 점  (0) 2017.08.30
1069 집으로  (0) 2017.08.30
2570 비숍  (0) 2017.08.30

+ Recent posts