이것도 이전에 코딩은 다 해놨는데 결과값 배열이 너무 커서 메모리초과가 나는 문제가 있었다.


double d[20][1048575];


이녀석이 문제였는데 지금 생각해보니 해법은 간단하다. 어차피 한단계 전의 것만 참조하므로 [2][]로 선언해 주고 %2로 구분하면 되는것.


※ 소수점 자리 신경안쓰다가 한번 틀렸다. 정신차리자


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
#include <stdio.h>
#include <algorithm>
using namespace std;
 
int n, a[21][21];
double d[2][1048575];
 
int main() {
    scanf("%d"&n);
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d"&a[i][j]);
        }
    }
    int rm = 1 << n;
 
    for (int i = 0; i < n; i++) d[0][1 << i] = a[0][i];
 
    for (int i = 0; i < n - 1; i++for (int j = 0; j < rm; j++) {
        if (d[i % 2][j]) {
            for (int k = 0; k < n; k++) {
                if ((j&(1 << k)) == 0)
                    d[(i + 1) % 2][j | (1 << k)] = max(d[(i + 1) % 2][j | (1 << k)], d[i % 2][j] * a[i + 1][k] / 100);
            }
        }
    }
 
    printf("%.10f\n", d[(n - 1)%2][rm - 1]);
    return 0;
}
cs


'BOJ' 카테고리의 다른 글

3187 양치기 꿍  (0) 2017.09.12
3640 제독  (0) 2017.09.07
1733 등번호  (0) 2017.09.06
2311 왕복 여행  (0) 2017.09.06
5588 별자리 찾기  (0) 2017.09.06

+ Recent posts