BOJ : https://www.acmicpc.net/problem/9095

 

9095번: 1, 2, 3 더하기

문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다. 출력 각

www.acmicpc.net

 

문제를 풀고나니 피보나치 형태인걸 알았습니다

dfs로 구현했습니다..

아래코드는 N이 큰 수가 나왔을 때 까지의 경우를 생각해서 해결한 코드입니다.

N이 작다면 굳이 점화식을 사용하지않아도 됩니다.

 

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
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
 
ll dp[101];
 
ll solve(int n) {
    if (n < 0return 0;
    if (n == 0return 1;
 
    ll& res = dp[n];
    if (res) return dp[n];
 
    return res = solve(n - 1+ solve(n - 2+ solve(n - 3);
}
 
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    
    int T;
    cin >> T;
    while (T--) {
        int N;
        cin >> N;
        cout << solve(N) << "\n";
    }
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

복습 20.02.08

 

'algorithm > BOJ' 카테고리의 다른 글

BOJ 2302번 극장 좌석  (0) 2020.02.09
BOJ 2579번 계단 오르기  (0) 2020.02.08
BOJ 15486번 퇴사 2  (0) 2020.02.08
BOJ 1010번 다리 놓기  (0) 2020.02.08
BOJ 2163번 초콜릿 자르기  (0) 2020.02.08

BOJ : https://www.acmicpc.net/problem/15486

github : https://github.com/junho0956/Algorithm/blob/master/15486/15486/%EC%86%8C%EC%8A%A4.cpp

 

 

퇴사1, 2 의 문제를 혼자 바로 풀수 있는 정도가 되서

너무 행복합니다.

dp는 너무 어려워요 ㅠㅠ

 

퇴사1는 dp를 사용하지않고 dfs 로 간단히 해결가능하지만

퇴사2는 dp를 사용해야 TLE를 벗어날 수 있습니다.

 

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
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
 
int N;
ll dp[1500001];
pair<intint> arr[1500001];
 
ll solve(int day) {
    if (day >= N + 1return 0;
 
    ll& res = dp[day];
    if (res) return dp[day];
 
    ll ans = solve(day + 1);
    if (day + arr[day].first <= N + 1) ans = max(ans, arr[day].second + solve(arr[day].first + day));
 
    return res = ans;
}
 
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
 
    cin >> N;
    for (int i = 1; i <= N; i++cin >> arr[i].first >> arr[i].second;
 
    ll ans = 0;
    for (int i = 1; i <= N; i++) {
        ans = max(ans, solve(i));
    }
 
    cout << ans;
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > BOJ' 카테고리의 다른 글

BOJ 2579번 계단 오르기  (0) 2020.02.08
BOJ 9095번 1, 2, 3 더하기  (0) 2020.02.08
BOJ 1010번 다리 놓기  (0) 2020.02.08
BOJ 2163번 초콜릿 자르기  (0) 2020.02.08
BOJ 1062번 가르침  (0) 2020.02.05

BOJ : https://www.acmicpc.net/problem/1010

 

1010번: 다리 놓기

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

www.acmicpc.net

 

왼쪽과 오른쪽에 다리가 있을 수 있는 경우를 몆가지 작은수로 직접 구해보자

그럼 2차원배열에 대한 dp점화식을 발견할 수 있게 된다

 

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
#include <cstdio>
#pragma warning(disable:4996)
int dp[30][30];
int N, M;
int main() {
 
    dp[1][1= 1;
    for (int i = 1; i < 30; i++) dp[1][i] = i;
    for (int i = 2; i < 30; i++) {
        for (int k = 1; k < 30; k++) {
            if (i > k)dp[i][k] = 0;
            else dp[i][k] = dp[i - 1][k - 1+ dp[i][k - 1];
        }
    }
 
    int T;
    scanf("%d"&T);
    while (T--) {
        scanf("%d%d"&N, &M);
        printf("%d\n", dp[N][M]);
    }
    
    
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > BOJ' 카테고리의 다른 글

BOJ 9095번 1, 2, 3 더하기  (0) 2020.02.08
BOJ 15486번 퇴사 2  (0) 2020.02.08
BOJ 2163번 초콜릿 자르기  (0) 2020.02.08
BOJ 1062번 가르침  (0) 2020.02.05
BOJ 1072번 게임  (0) 2020.02.05

BOJ : https://www.acmicpc.net/problem/2163

 

2163번: 초콜릿 자르기

정화는 N×M 크기의 초콜릿을 하나 가지고 있다. 초콜릿은 금이 가 있는 모양을 하고 있으며, 그 금에 의해 N×M개의 조각으로 나눠질 수 있다. 초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿을 친구들과 나눠 먹기로 했다. 이를 위해서 정화는 초콜릿을 계속 쪼개서 총 N×M개의 조각으로 쪼개려고 한다. 초콜릿을 쪼갤 때에는 초콜릿 조각을 하나 들고, 적당한 위치에서 초콜릿을 쪼갠다. 초콜릿을 쪼갤 때에는 금이 가 있는 위치에서만 쪼갤 수 있다. 이와

www.acmicpc.net

초콜릿을 자른다는 의미는 최소횟수가 그냥 횟수입니다

N개의 가로에 대해 다 자르면 N-1번이 필요하고

이에 대해 M개의 세로에 대해 자를려면 N개를 M-1번만큼 자르면 됩니다

 

복습)20.02.08

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int N, M;
 
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    
    cin >> N >> M;
 
    cout << (N - 1+ (N)*(M-1);
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > BOJ' 카테고리의 다른 글

BOJ 15486번 퇴사 2  (0) 2020.02.08
BOJ 1010번 다리 놓기  (0) 2020.02.08
BOJ 1062번 가르침  (0) 2020.02.05
BOJ 1072번 게임  (0) 2020.02.05
BOJ 15922번 아우으 우아으이야!!  (0) 2020.02.05

+ Recent posts