Algorithm/Problem Solving 2020. 4. 20. 22:06

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/1699

 

사용 알고리즘

- DP

 

풀이

- d[i] = i를 제곱수의 합으로 나타냈을 때, 필요한 항의 최소 개수

- d[i] = min(d[i - (j * j)] + 1) (1 <= i <= j * j)

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/1699.cpp

#include <cstdio>

 

int d[100003];

int a[100003];

 

int main(void) {

    int n; scanf("%d"&n);

    for (int i = 1; i <= n; ++i) {

        for (int j = 1; j * j <= i; ++j) {

            if (d[i] == 0) {

                d[i] = d[i - (j * j)] + 1;

            }

            else {

                if (d[i] > d[i - (j * j)] + 1) d[i] = d[i - (j * j)] + 1;

            }

        }

    }

    printf("%d\n", d[n]);

    return 0;

}

Colored by Color Scripter

cs

'Algorithm > Problem Solving' 카테고리의 다른 글

[BOJ/9461] 파도반 수열  (0) 2020.04.22
[BOJ/2133] 타일 채우기  (0) 2020.04.22
[BOJ/2579] 계단 오르기  (0) 2020.04.20
[BOJ/1912] 연속합  (0) 2020.04.19
[BOJ/11054] 가장 긴 바이토닉 부분 수열  (0) 2020.04.19
posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 20. 21:25

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/2579

 

사용 알고리즘

- DP

 

풀이

- d[i] = i번째 계단에 올라갔을 때의 최대 점수

- d[i] = max(d[i - 2] + a[i], d[i - 3] + a[i - 1] + a[i])

1개 연속 : i - 2번째 계단은 밟고, i - 1번째 계단은 밟지 않아야 됨

2개 연속 : i - 3번째 계단은 밟고, i - 2번째 계단은 밟지 않고, i - 1번째 계단은 밟아야 됨

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/2579.cpp

#include <cstdio>
#include <algorithm>
 
using namespace std;
 
int d[303];
int a[303];
 
int main(void) {
    int n; scanf("%d"&n);
    int ans = -1;
    for (int i = 1; i <= n; ++i) {
        scanf("%d"&a[i]);
        if (i == 1) d[i] = a[i];
        else if (i == 2) d[i] = a[i] + a[i - 1];
        else d[i] = max(d[i - 2+ a[i], d[i - 3+ a[i - 1+ a[i]);
    }
    printf("%d\n", d[n]);
    return 0;
}

Colored by Color Scripter

cs

 

posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 19. 21:12

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/1912

 

사용 알고리즘

- DP

 

풀이

- d[i] = a[i]를 가장 마지막으로 하는 가장 큰 연속합

- d[i] = max(d[i - 1] + a[i], a[i])

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/1912.cpp

#include <cstdio>

 

int d[100003];

int a[100003];

 

int main(void) {

    int n; scanf("%d"&n);

    int ans = -100000003;

    for (int i = 1; i <= n; ++i) {

        scanf("%d"&a[i]);

        d[i] = (a[i] > (d[i - 1+ a[i])) ? a[i] : d[i - 1+ a[i];

        if (ans < d[i]) ans = d[i];

    }

    printf("%d\n", ans);

    return 0;

}

Colored by Color Scripter

cs

posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 19. 20:14

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/11054

 

사용 알고리즘

- DP

 

풀이

- d1[i] = a[i]를 가장 마지막으로 하는 가장 긴 증가하는 부분 수열의 길이

- d2[i] = a[i]를 가장 마지막으로 하는 가장 긴 감소하는 부분 수열의 길이

- d[i] = d1[i] + d2[i] - 1

i가 겹치게 되므로 -1 처리

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/11054.cpp

#include <cstdio>
 
int d1[1003], d2[1003];
int a1[1003], a2[1003];
 
int main(void) {
    int n; scanf("%d"&n);
    for (int i = 0; i < n; ++i) {
        scanf("%d"&a1[i]);
        a2[n - i - 1= a1[i];
    }
    for (int i = 0; i < n; ++i) {
        d1[i] = 1;
        d2[i] = 1;
        for (int j = 0; j < i; ++j) {
            if ((a1[i] > a1[j]) && (d1[j] + 1 > d1[i])) d1[i] = d1[j] + 1;
            if ((a2[i] > a2[j]) && (d2[j] + 1 > d2[i])) d2[i] = d2[j] + 1;
        }
    }
    int ans = -1;
    for (int i = 0; i < n; ++i) {
        if (ans < (d1[i] + d2[n - i - 1- 1)) ans = d1[i] + d2[n - i - 1- 1;
    }
    printf("%d\n", ans);
    return 0;
}

Colored by Color Scripter

cs

posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 18. 22:40

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/11722

 

사용 알고리즘

- DP

 

풀이

- d[i] = a[i]를 가장 마지막으로 하는 가장 긴 감소하는 부분 수열의 길이

- d[i] = max(d[j]) + 1 (j < i, a[j] > a[i])

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/11722.cpp

#include <cstdio>
 
int d[1003];
int a[1003];
 
int main(void) {
    int n; scanf("%d"&n);
    for (int i = 0; i < n; ++i) scanf("%d"&a[i]);
    int ans = -1;
    for (int i = 0; i < n; ++i) {
        d[i] = 1;
        for (int j = 0; j < i; ++j) {
            if ((a[i] < a[j]) && (d[j] + 1 > d[i])) d[i] = d[j] + 1;
        }
        if (ans < d[i]) ans = d[i];
    }
    printf("%d\n", ans);
    return 0;
}

Colored by Color Scripter

cs

 

posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 18. 22:27

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/11055

 

사용 알고리즘

- DP

 

풀이

- d[i] = a[i]를 가장 마지막으로 하는 가장 큰 증가 부분 수열의 합

- d[i] = max(d[j]) + a[i] (j < i, a[j] < a[i])

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/11055.cpp

#include <cstdio>

 

int d[1003];

int a[1003];

 

int main(void) {

    int n; scanf("%d"&n);

    for (int i = 0; i < n; ++i) scanf("%d"&a[i]);

    int ans = -1;

    for (int i = 0; i < n; ++i) {

        d[i] = a[i];

        for (int j = 0; j < i; ++j) {

            if ((a[j] < a[i]) && (d[j] + a[i] > d[i])) d[i] = d[j] + a[i];

        }

        if (ans < d[i]) ans = d[i];

    }

    printf("%d\n", ans);

    return 0;

}

Colored by Color Scripter

cs

posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 17. 21:10

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/11053

 

사용 알고리즘

- DP

 

풀이

- d[i] = a[i]를 가장 마지막으로 하는 가장 긴 증가하는 부분 수열의 길이

- d[i] = max(d[j]) + 1 (j < i, a[j] < a[i])

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/11053.cpp

#include <cstdio>

 

int d[1003];

int a[1003];

 

int main(void) {

    int n; scanf("%d"&n);

    for (int i = 1; i <= n; ++i) scanf("%d"&a[i]);

    int ans = 0;

    for (int i = 1; i <= n; ++i) {

        d[i] = 1;

        for (int j = 1; j < i; ++j) {

            if ((a[j] < a[i]) && (d[j] + 1 > d[i])) d[i] = d[j] + 1;

        }

        if (ans < d[i]) ans = d[i];

    }

    printf("%d\n", ans);

    return 0;

}

Colored by Color Scripter

cs

'Algorithm > Problem Solving' 카테고리의 다른 글

[BOJ/11722] 가장 긴 감소하는 부분 수열  (0) 2020.04.18
[BOJ/11055] 가장 큰 증가 부분 수열  (0) 2020.04.18
[BOJ/2156] 포도주 시식  (0) 2020.04.17
[BOJ/9465] 스티커  (0) 2020.04.16
[BOJ/11057] 오르막 수  (0) 2020.04.16
posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 17. 20:50

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/2156

 

사용 알고리즘

- DP

 

풀이

- d[i][j] = i번째 포도주까지 마셨을 때의 최대 포도주의 양. i번째 포도주는 j번 연속으로 마심

- d[i][0] = max(d[i - 1][0], d[i - 1][1], d[i - 1][2])

- d[i][1] = d[i - 1][0] + p[i]

- d[i][2] = d[i - 1][1] + p[i]

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/2156.cpp

#include <cstdio>
#include <algorithm>
 
using namespace std;
 
int d[10003][3];
int p[10003];
 
int main(void) {
    int n; scanf("%d"&n);
    for (int i = 1; i <= n; ++i) scanf("%d"&p[i]);
    for (int i = 1; i <= n; ++i) {
        d[i][0= max(d[i - 1][0], max(d[i - 1][1], d[i - 1][2]));
        d[i][1= d[i - 1][0+ p[i];
        d[i][2= d[i - 1][1+ p[i];
    }
    printf("%d\n", max(d[n][0], max(d[n][1], d[n][2])));
    return 0;
}

Colored by Color Scripter

cs

 

'Algorithm > Problem Solving' 카테고리의 다른 글

[BOJ/11055] 가장 큰 증가 부분 수열  (0) 2020.04.18
[BOJ/11053] 가장 긴 증가하는 부분 수열  (0) 2020.04.17
[BOJ/9465] 스티커  (0) 2020.04.16
[BOJ/11057] 오르막 수  (0) 2020.04.16
[BOJ/10844] 쉬운 계단 수  (0) 2020.04.14
posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 16. 22:59

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/9465

 

사용 알고리즘

- DP

 

풀이

- d[i][j] = 2 * i개의 스티커에서 얻을 수 있는 최대점수, i번째 열에서 뜯는 스티커는 j

- d[i][0] = max(d[i - 1][0], d[i - 1][1], d[i - 1][2]) (j = 0 : 위, 아래 모두 뜯지 않음)

- d[i][1] = max(d[i - 1][0], d[i - 1][2]) + p[i][0] (j = 1 : 위만 뜯음)

- d[i][2] = max(d[i - 1][0], d[i - 1][1]) + p[i][1] (j = 2 : 아래만 뜯음)

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/9465.cpp

#include <cstdio>

#include <algorithm>

 

using namespace std;

 

int d[100003][3];

int arr[100003][2];

 

int main(void) {

    int t; for (scanf("%d"&t); t--;) {

        int n; scanf("%d"&n);

        for (int i = 0; i < n; ++i) scanf("%d"&arr[i][0]);

        for (int i = 0; i < n; ++i) scanf("%d"&arr[i][1]);

        d[0][1= arr[0][0]; d[0][2= arr[0][1];

        for (int i = 1; i < n; ++i) {

            d[i][0= max(d[i - 1][0], max(d[i - 1][1], d[i - 1][2]));

            d[i][1= max(d[i - 1][0], d[i - 1][2]) + arr[i][0];

            d[i][2= max(d[i - 1][0], d[i - 1][1]) + arr[i][1];

        }

        printf("%d\n", max(d[n - 1][0], max(d[n - 1][1], d[n - 1][2])));

    }

    return 0;

}

Colored by Color Scripter

cs

posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 16. 22:52

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/11057

 

사용 알고리즘

- DP

 

풀이

- d[i][j] = i자리 오르막 수의 개수, i번째 자리의 수는 j

- d[1][i] = 1

- d[i][j] += d[i - 1][k] (0 <= k <= j)

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/11057.cpp

#include <cstdio>

 

int d[1003][10];

 

int main(void) {

    int n; scanf("%d"&n);

    for (int i = 0; i <= 9++i) d[1][i] = 1;

    for (int i = 2; i <= n; ++i) {

        for (int j = 0; j <= 9++j) {

            for (int k = 0; k <= j; ++k) {

                d[i][j] += d[i - 1][k];

                d[i][j] %= 10007;

            }

        }

    }

    int ans = 0;

    for (int i = 0; i <= 9++i) {

        ans += d[n][i];

        ans %= 10007;

    }

    printf("%d\n", ans);

    return 0;

}

Colored by Color Scripter

cs

'Algorithm > Problem Solving' 카테고리의 다른 글

[BOJ/11055] 가장 큰 증가 부분 수열  (0) 2020.04.18
[BOJ/11053] 가장 긴 증가하는 부분 수열  (0) 2020.04.17
[BOJ/2156] 포도주 시식  (0) 2020.04.17
[BOJ/9465] 스티커  (0) 2020.04.16
[BOJ/10844] 쉬운 계단 수  (0) 2020.04.14
posted by DevMoomin
: