티스토리 뷰

처음에 그리디라고 생각했는데 틀렸다

이 문제 메모리가 500메가라서 dp[10000][10000]를 잡고

dp를 해도 통과한다 

그리고 q가 100이라서 시간도 많이 안드나보다


테이블을 d[l][r]로 잡고

l~r까지 탈출시킬 때 최소값 이라고 생각하고 돌리자

그리고 q명의 죄수를 미리 set에 넣어두자

함수에서 l~r까지 보다가 만약 set에 있는 k라는 값을 만난다면

(r-l) + d[l][k-1] + d[k+1][r]을 구하러 가보자

그리고 ret값은 1e9로 잡아두고 만약 죄수를 아무도 못만나면

0을 리턴해줘야 식에 맞게 답을 구할 수 있다

이렇게 다 해보면 나온다!


소스코드

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
#include <iostream>
#include <algorithm>
#include <set>
#include <cstring>
using namespace std;
int d[10010][10010];
set<int> s;
int n, m;
int go(int l, int r) {
    if (l >= r) return 0;
    int&ret = d[l][r];
    if (ret != -1return ret;
    ret = 1e9;
    bool ok = true;
    for (int i = l; i <= r; i++) {
        if (s.count(i)) {
            ok = false;
            int temp = (r-l) + go(l, i - 1+ go(i + 1, r);
            ret = min(ret, temp);
        }
    }
    if (ok) ret = 0;
    return ret;
}
int main() {
    memset(d, -1sizeof(d));
    scanf(" %d %d"&n, &m);
    for (int i = 0; i < m; i++) {
        int x; scanf(" %d"&x); s.insert(x);
    }
    printf("%d\n", go(1, n));
}
 
cs

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 14679 영우와 '갓4'  (0) 2018.07.19
[백준] 5446 용량 부족  (0) 2018.07.18
[백준] 12899 데이터 구조  (0) 2018.07.18
[백준] 12897 Candy  (0) 2018.07.18
[백준] 12888 완벽 이진 트리 도로 네트워크  (0) 2018.07.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
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
글 보관함