기술 블로그

10803번 정사각형 만들기 본문

알고리즘 문제/BOJ

10803번 정사각형 만들기

parkit 2020. 3. 5. 17:10
728x90
반응형

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



boj dp 메모이제이션 캐시 cache 복습 코데 코딩 한국정보올림피아드



r을 무조건 작게, c는 크게 설정하였다.


또한, 21 ~ 23번 째 줄이 핵심인 것 같다. 3을 2로 하면, 틀린다. 


이유는 잘 모르겠다.. 





시간 초과 및 SOF 코드

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
36
37
38
39
40
41
42
43
44
#include <bits/stdc++.h>
 
using namespace std;
 
#define INF 2e9
 
int R, C, cache[101][10001];
 
int simulation(int r, int c)
{
    if (r > c) return simulation(c, r);
    if (c % r == 0return c / r;
 
    int &ret = cache[r][c];
    if (ret != -1return ret;
 
    ret = INF;
 
    int q = c / r;
    int rmd = c % r;
 
    ret = min(ret, simulation(r, rmd) + q);;
 
    for (int i = 1; i <= r / 2; i++) {
        ret = min(ret, simulation(r - i, c) + simulation(i, c));
    }
 
    for (int i = 1; i <= c / 2; i++) {
        ret = min(ret, simulation(r, c - i) + simulation(r, i));
    }
    
    return ret;
}
 
int main()
{
    cin.tie(0);
    memset(cache, -1sizeof(cache));
 
    scanf("%d %d"&C, &R);
    printf("%d\n", simulation(min(R, C), max(R, C)));
 
    return 0;
}
cs





정답 코드

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
36
37
38
39
40
41
42
43
44
45
46
47
#include <bits/stdc++.h>
 
using namespace std;
 
#define INF 2e9
 
int R, C, cache[101][10001];
 
int simulation(int r, int c)
{
    if (r > c) return simulation(c, r);
    if (c % r == 0return c / r;
 
    int &ret = cache[r][c];
    if (ret != -1return ret;
 
    ret = INF;
 
    int q = c / r;
 
    if (q >= 3) {
        ret = min(ret, simulation(r, c - r) + 1);;
    }
    else
    {
        for (int i = 1; i <= r / 2; i++) {
            ret = min(ret, simulation(r - i, c) + simulation(i, c));
        }
 
        for (int i = 1; i <= c / 2; i++) {
            ret = min(ret, simulation(r, c - i) + simulation(r, i));
        }
    }
    
    return ret;
}
 
int main()
{
    cin.tie(0);
    memset(cache, -1sizeof(cache));
 
    scanf("%d %d"&C, &R);
    printf("%d\n", simulation(min(R, C), max(R, C)));
 
    return 0;
}
cs






















728x90
반응형

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

11400번 단절선  (0) 2020.03.06
10805번 L 모양의 종이 자르기  (0) 2020.03.06
10800번 컬러볼  (0) 2020.03.04
2589번 보물섬  (0) 2020.03.03
18513번 샘터  (0) 2020.03.02