Dynamic Programming

ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ ์„œ ํ‘ธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

  1. Overlapping Subproblem (๊ฒน์น˜๋Š” ๋ถ€๋ถ„๋ฌธ์ œ)

  2. Optimal Substructure(๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ž‘์€ ๋ถ€๋ถ„์—์„œ ์•Œ ์ˆ˜ ์žˆ์„ ๋•Œ) : ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ •๋‹ต์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•˜๋‹ค.

์ด ๋‘๊ฐ€์ง€ ์†์„ฑ์„ ๋งŒ์กฑํ•ด์•ผ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

Overlapping Subproblem

  • ๋ฌธ์ œ : N๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

  • ์ž‘์€๋ฌธ์ œ : N-1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ, N-2๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

  • ๋ฌธ์ œ : N-1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

  • ์ž‘์€๋ฌธ์ œ : N-2๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ, N-3๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

  • ๋ฌธ์ œ : N-2๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

  • ์ž‘์€๋ฌธ์ œ : N-3๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ, N-3๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

์ž‘์€ ๋ฌธ์ œ๊ฐ€ ๊ฒน์ณ์•ผํ•œ๋‹ค. ํฐ ๋ฌธ์ œ์™€ ์ž‘์€ ๋ฌธ์ œ๋Š” ์ƒ๋Œ€์ ์ด๋‹ค.

  1. ํฐ ๋ฌธ์ œ์™€ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

  2. ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋‹ค.

Optimal Substructure

๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ž‘์€ ๋ฌธ์ œ์˜ ์ •๋‹ต์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

N-1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ = N-2๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ + N-3๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ๊ฐ ๋ฌธ์ œ๋Š” ํ•œ๋ฒˆ๋งŒ ํ’€์–ด์•ผ ํ•œ๋‹ค.

  • ๊ฐ™์€ ๋ฌธ์ œ๋Š” ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ์ •๋‹ต์ด ๊ฐ™๋‹ค.(Optimal Substructure)

  • ์ •๋‹ต์„ ๊ตฌํ–ˆ์œผ๋ฉด, ์ •๋‹ต์„ ์–ด๋”˜๊ฐ€์— ๋ฉ”๋ชจํ•ด๋†“๋Š”๋‹ค.(๋ฐฐ์—ด)=>Memoization

Top-down

  1. ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆˆ๋‹ค.

  2. ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค.

  3. ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค.

์žฌ๊ท€ํ˜ธ์ถœ์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์ฑ„์›Œ์•ผํ•˜๋Š” ์นธ์˜ ์ˆ˜ X ํ•œ ์นธ์„ ์ฑ„์šฐ๋Š” ๋ณต์žก๋„(ํ•จ์ˆ˜ํ•˜๋‚˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„)์ด๋‹ค.

// cpp
int memo[100]; //memoization
int fibonacci(int n){
    if(n<=1){
        return n;
    }else{
        if(memo[n]>0){
            return memo[n];
        }
        memo[n] = fibonacci(n-1)+fibonacci(n-2);
        return memo[n];
    }
}
# python
# memorization
d = [0] * 100

def fibonacci_recursion(x):

    # 1 or 2 ๋Š” 1
    if x == 1 or x == 2:
        return 1

    # ์ด๋ฏธ ํ•œ๋ฒˆ ํ˜ธ์ถœ๋œ ์  ์žˆ๋Š” ๊ฐ’์€ ๊ธฐ์–ตํ•ด๋‘” ๊ฐ’ ๋ฐ˜ํ™˜
    if d[x]!=0:
        return d[x]

    # ํ•œ๋ฒˆ๋„ ํ˜ธ์ถœ๋œ์  ์—†๋Š” ๊ฐ’์€ ์ถ”๊ฐ€
    d[x] = fibonacci_recursion(x-1) + fibonacci_recursion(x-2)
    return d[x]

print(fibonacci_recursion(6))

Bottom-up

  1. ๋ฌธ์ œ๋ฅผ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ‘ผ๋‹ค.

  2. ๋ฌธ์ œ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ๊ธˆ์”ฉ ํฌ๊ฒŒ ๋งŒ๋“ค๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค.

  3. ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์™”๊ธฐ ๋•Œ๋ฌธ์—, ํฐ ๋ฌธ์ œ๋Š” ํ•ญ์ƒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

int d[100];
int fibonacci(int n){
    d[0]=1;
    d[1]=1;
    for(int i=2;i<=n;i++){
        d[i]=d[i-1]+d[i-2];
    }
    return d[n];
}
# bottom-up

# dp table
d = [0] * 100

def fibonacci_loop(n):
    d[1] = 1
    d[2] = 1

    for i in range(3,n+1):
        d[i] = d[i-1]+d[i-2]

    print(d[n])

fibonacci_loop(99)

memoization์„ ํ•  ๋•Œ ๋ฌด์—‡์„ ๊ธฐ๋กํ•ด์•ผํ• ์ง€ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์šฐ์„ ์ด๋‹ค.

Top-down(memorization) ๋ฐฉ์‹์€ 'ํ•˜ํ–ฅ์‹'์ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, bottom-up ๋ฐฉ์‹์€ '์ƒํ–ฅ์‹'์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค. DP์˜ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ๋Š” bottom-up ๋ฐฉ์‹์ด๋‹ค.

Bottom-up ๋ฐฉ์‹์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฐ๊ณผ ์ €์žฅ์šฉ ๋ฆฌ์ŠคํŠธ(๋ฐฐ์—ด)๋Š” DP ํ…Œ์ด๋ธ” ์ด๋ผ ๋ถ€๋ฅด๋ฉฐ, memorization์€ Top-down ๋ฐฉ์‹์— ๊ตญํ•œ๋˜์–ด ์‚ฌ์šฉ๋˜๋Š” ํ‘œํ˜„์ด๋‹ค.

์‹ค์Šต

1๋กœ ๋งŒ๋“ค๊ธฐ

D[N] = N์„ 1๋กœ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ ์—ฐ์‚ฐ์˜ ์ตœ์†Ÿ๊ฐ’ 1. N์ด 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด, 3์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค. D[N/3]+1 2. N์ด 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด, 2๋กœ ๋‚˜๋ˆˆ๋‹ค. D[N/2]+1 3. 1์„ ๋บ€๋‹ค. D[N-1]+1

=> D[N]=min(1,2,3)

top-down

#include <iostream>

//Top-Down(์žฌ๊ท€)
int d[1000001];
int divn(int n){
    if(n==1) return 0;
    if(d[n]>0) return d[n];
    //-1
    d[n]=divn(n-1)+1;
    if(n%2==0){
        int temp=divn(n/2)+1;
        if(d[n]>temp) d[n] = temp;
    }
    if(n%3==0){
        int temp=divn(n/3)+1;
        if(d[n]>temp) d[n] = temp;
    }
    return d[n];
}

bottom-up

//Bottom-up
void divbu(int n){
    d[1]=0;
    for(int i=2;i<=n;i++){
        d[i]=d[i-1]+1;
        if(i%2==0 && d[i]>d[i/2]+1){
            d[i]=d[i/2]+1;
        }
        if(i%3==0 && d[i]>d[i/3]+1){
            d[i]=d[i/3]+1;
        }
    }
    printf("%d",d[n]);
}

2Xn ํƒ€์ผ๋ง

2Xn ์ง์‚ฌ๊ฐํ˜•์„ 1x2,2x1ํƒ€์ผ๋กœ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜ => D[n]=2xi์ง์‚ฌ๊ฐํ˜•์„ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜ => D[n]=D[n-1]+D[n-2]

์ด ๋•Œ, n=0์ผ ๋•Œ๋„ ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— 1์„ ์ถœ๋ ฅํ•œ๋‹ค.

bottom-up

#include <iostream>
using namespace std;

int d[10001];
int main() {
    int x;
    cin >> x;
    d[1]=1;
    d[0]=1;
    for(int i=2;i<=x;i++){
        d[i]=d[i-1]+d[i-2];
        d[i]%=10007;
    }
    cout << d[x] << "\n";
}

2xn ํƒ€์ผ๋ง 2

2Xn ์ง์‚ฌ๊ฐํ˜•์„ 1x2,2x1,2x2ํƒ€์ผ๋กœ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜ => D[n]=2xi์ง์‚ฌ๊ฐํ˜•์„ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜ => D[n]=D[n-1]+2*D[n-2]

bottom-up

#include <iostream>
using namespace std;

int d[10001];
int main() {
    int x;
    cin >> x;
    d[1]=1;
    d[0]=1;
    for(int i=2;i<=x;i++){
        d[i]=d[i-1]+2*d[i-2];
        d[i]%=10007;
    }
    cout << d[x] << "\n";
}

1,2,3 ๋”ํ•˜๊ธฐ

์ •์ˆ˜ n์„ 1,2,3์˜ ์กฐํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ => D[n]=์ •์ˆ˜ n์„ 1,2,3์˜ ์กฐํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜ => ๋งˆ์ง€๋ง‰์— ์˜ค๋Š” ์ˆ˜๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. => D[n]=D[n-1]+D[n-2]+D[n-3]

bottom-up

#include <iostream>
using namespace std;

int d[10001];
int main() {
    int t;
    cin >> t;
    while(t--){
        int x;
        cin >> x;
        d[1]=1;
        d[0]=1;
        d[2]=2;
        for(int i=2;i<=x;i++){
            d[i]=d[i-1]+d[i-2]+d[i-3];
        }
        cout << d[x] << "\n";
    }
}

๋ถ•์–ด๋นต ํŒ๋งคํ•˜๊ธฐ

๋ถ•์–ด๋นต i๊ฐœ๋ฅผ ํŒ”์•„์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ต P[i]์ผ ๋•Œ, N๊ฐœ๋ฅผ ๋ชจ๋‘ ํŒ๋งคํ•ด์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ˆ˜์ต๊ตฌํ•˜๊ธฐ => D[n]=n๊ฐœ๋ฅผ ๋ชจ๋‘ ํŒ๋งคํ•ด์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์ˆ˜์ต

๋ถ•์–ด๋นต ์ˆ˜

๊ฐ€๊ฒฉ

๋‚จ์€ ๋ถ•์–ด๋นต์˜ ์ˆ˜

์ตœ๋Œ€์ˆ˜์ต ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ

1

P[1]

n-1

P[1]+D[n-1]

2

P[2]

n-2

P[2]+D[n-2]

...

...

...

...

n-1

P[n-1]

1

P[n-1]+D[1]

n

P[n]

0

P[n]+D[0]

=> D[n] = max(P[i]+D[n-i])(1<=i<=n)

#include <iostream>
using namespace std;

int d[10001];//๋ถ•์–ด๋นต n๊ฐœ๋ฅผ ํŒ”์•„์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์ˆ˜์ต
int p[10001];
int main(){
    int n;//๋ถ•์–ด๋นต์˜ ์ˆ˜
    scanf("%d",&n);

    for(int i=1;i<=n;i++){
        scanf("%d",&p[i]);
    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            d[i]=max(d[i],d[i-j]+p[j]);
        }
    }
    cout<<d[n];
}

์‰ฌ์šด ๊ณ„๋‹จ ์ˆ˜

์ธ์ ‘ํ•œ ์ž๋ฆฌ์˜ ์ฐจ์ด๊ฐ€ 1์ด ๋‚˜๋Š” ์ˆ˜๋ฅผ ๊ณ„๋‹จ ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค. ex)45656 ๊ธธ์ด๊ฐ€ N์ธ ๊ณ„๋‹จ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ.(0์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ˆ˜๋Š” ์—†๋‹ค.)

=> D[N][L]=N์ž๋ฆฌ ๊ณ„๋‹จ์ˆ˜, ๋งˆ์ง€๋ง‰ ์ˆ˜ L L -> L+1 or L-1 => D[N][L]=D[N-1][L-1]+D[N-1]+D[L+1]

#include <iostream>
using namespace std;

int d[101][9];
int main(){
    int n,ans=0;
    scanf("%d",&n);

    for(int j=1;j<=9;j++){
        d[1][j]=1;
    }
    for(int i=2;i<=n;i++){
        for(int j=0;j<=9;j++){
            d[i][j]=0;
            if(j-1>=0)d[i][j]+=d[i-1][j-1];
            if(j+1<=9)d[i][j]+=d[i-1][j+1];
        }
    }
    for(int j=0;j<=9;j++){
        ans+=d[n][j];
    }
    printf("%d",ans);
}

์˜ค๋ฅด๋ง‰ ์ˆ˜

์˜ค๋ฅด๋ง‰ ์ˆ˜๋Š” ์ˆ˜์˜ ์ž๋ฆฌ๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์ด๋ฃจ๋Š” ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ์ด ๋•Œ, ์ธ์ ‘ํ•œ ์ˆ˜๊ฐ€ ๊ฐ™์•„๋„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์นœ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2234์™€ 3678, 11119๋Š” ์˜ค๋ฅด๋ง‰ ์ˆ˜์ด์ง€๋งŒ, 2232, 3676, 91111์€ ์˜ค๋ฅด๋ง‰ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ˆ˜์˜ ๊ธธ์ด N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์˜ค๋ฅด๋ง‰ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ˆ˜๋Š” 0์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

=> D[N][L]=N์ž๋ฆฌ ์˜ค๋ฅด๋ง‰์ˆ˜, ๋งˆ์ง€๋ง‰์ˆ˜ L => D[N][L]=sum(D[N-1][k])(0<=k<=L)

#include <iostream>
using namespace std;

int d[1001][10];
int main(){
    int n;
    scanf("%d",&n);

    for(int j=0;j<=9;j++){
        d[1][j]=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];
    int ans=0;
    for(int j=0;j<=9;j++){
        ans+=d[n][j];
    }
    printf("%d",ans);
}

์ด์นœ์ˆ˜

0๊ณผ 1๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ์ˆ˜๋ฅผ ์ด์ง„์ˆ˜๋ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์ง„์ˆ˜ ์ค‘ ํŠน๋ณ„ํ•œ ์„ฑ์งˆ์„ ๊ฐ–๋Š” ๊ฒƒ๋“ค์ด ์žˆ๋Š”๋ฐ, ์ด๋“ค์„ ์ด์นœ์ˆ˜(pinary number)๋ผ ํ•œ๋‹ค. ์ด์นœ์ˆ˜๋Š” ๋‹ค์Œ์˜ ์„ฑ์งˆ์„ ๋งŒ์กฑํ•œ๋‹ค.

  • ์ด์นœ์ˆ˜๋Š” 0์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์ด์นœ์ˆ˜์—์„œ๋Š” 1์ด ๋‘ ๋ฒˆ ์—ฐ์†์œผ๋กœ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, 11์„ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด๋กœ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด 1, 10, 100, 101, 1000, 1001 ๋“ฑ์ด ์ด์นœ์ˆ˜๊ฐ€ ๋œ๋‹ค. ํ•˜์ง€๋งŒ 0010101์ด๋‚˜ 101101์€ ๊ฐ๊ฐ 1, 2๋ฒˆ ๊ทœ์น™์— ์œ„๋ฐฐ๋˜๋ฏ€๋กœ ์ด์นœ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

=> D[n]=D[n-1]+D[n-2] (n์ž๋ฆฌ 2์นœ์ˆ˜ = n๋ฒˆ์งธ ์ž๋ฆฌ์— 0+n๋ฒˆ์งธ ์ž๋ฆฌ์— 1)

#include <iostream>
using namespace std;

int d[91];
int main(){

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

    d[1]=1;
    d[2]=1;

    for(int i=3;i<=n;i++){
        d[i]=d[i-1]+d[i-2];
    }

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

์Šคํ‹ฐ์ปค

์Šคํ‹ฐ์ปค 2n๊ฐœ๊ฐ€ 2Xn๋ชจ์–‘์œผ๋กœ ๋ฐฐ์น˜๋˜์–ด์žˆ๋‹ค. ์Šคํ‹ฐ์ปค ํ•œ ์žฅ์„ ๋–ผ๋ฉด ๋ณ€์„ ๊ณต์œ ํ•˜๋Š” ์Šคํ‹ฐ์ปค๋Š” ๋ชจ๋‘ ์ฐข์–ด์ ธ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ ์ˆ˜์˜ ํ•ฉ์„ ์ตœ๋Œ€๋กœ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ. ์ฆ‰, 2n๊ฐœ์˜ ์Šคํ‹ฐ์ปค ์ค‘์—์„œ ์ ์ˆ˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋ฉด์„œ ์„œ๋กœ ๋ณ€์„ ๊ณต์œ  ํ•˜์ง€ ์•Š๋Š” ์Šคํ‹ฐ์ปค ์ง‘ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

=> D[n][s]=2Xn ์Šคํ‹ฐ์ปค ์ƒํƒœ s

  • s = 0์€ ๋œฏ์ง€ ์•Š์Œ

    • D[n][0]=n-1์—ด์—์„œ ์Šคํ‹ฐ์ปค๋ฅผ ์–ด๋–ป๊ฒŒ ๋œฏ์—ˆ๋Š”์ง€ ์ƒ๊ด€์ด ์—†๋‹ค. => max(D[n-1][0],D[n-1][1],D[n-1][2])

  • s = 1์€ ์œ„์ชฝ ์Šคํ‹ฐ์ปค ๋œฏ์Œ

    • D[n][1]= n-1์—ด์˜ ์œ„์ชฝ ์Šคํ‹ฐ์ปค๋Š” ๋œฏ์œผ๋ฉด ์•ˆ๋จ. max(D[n-1][0],D[n-1][2])+A[n][0]

  • s = 2๋Š” ์•„๋ž˜์ชฝ ์Šคํ‹ฐ์ปค ๋œฏ์Œ

    • D[n][1]= n-1์—ด์˜ ์•„๋ž˜์ชฝ ์Šคํ‹ฐ์ปค๋Š” ๋œฏ์œผ๋ฉด ์•ˆ๋จ. max(D[n-1][0],D[n-1][1])+A[n][1]

=> max(D[n][0],D[n][1],D[n][2])

#include <iostream>
using namespace std;

int d[100000][3];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);

        int array[n][2];
        for(int i=0;i<2;i++){
            for(int j=0;j<n;j++){
                scanf("%d",&array[j][i]);
            }
        }
        d[0][0]=0;
        d[0][1]=array[0][0];
        d[0][2]=array[0][1];
        for(int i=1;i<n;i++){
            d[i][0]=max(max(d[i-1][0], d[i-1][1]),d[i-1][2]);
            d[i][1]=max(d[i-1][0],d[i-1][2])+array[i][0];
            d[i][2]=max(d[i-1][0],d[i-1][1])+array[i][1];
        }
        printf("%d\n",max(max(d[n-1][0],d[n-1][1]),d[n-1][2]));
    }
}

ํฌ๋„์ฃผ์‹œ์‹

  1. ํฌ๋„์ฃผ ์ž”์„ ์„ ํƒํ•˜๋ฉด ๊ทธ ์ž”์— ๋“ค์–ด์žˆ๋Š” ํฌ๋„์ฃผ๋Š” ๋ชจ๋‘ ๋งˆ์…”์•ผ ํ•˜๊ณ , ๋งˆ์‹  ํ›„์—๋Š” ์›๋ž˜ ์œ„์น˜์— ๋‹ค์‹œ ๋†“์•„์•ผ ํ•œ๋‹ค.

  2. ์—ฐ์†์œผ๋กœ ๋†“์—ฌ ์žˆ๋Š” 3์ž”์„ ๋ชจ๋‘ ๋งˆ์‹ค ์ˆ˜๋Š” ์—†๋‹ค.

1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด ์žˆ๋Š” n๊ฐœ์˜ ํฌ๋„์ฃผ ์ž”์ด ์ˆœ์„œ๋Œ€๋กœ ํ…Œ์ด๋ธ” ์œ„์— ๋†“์—ฌ ์žˆ๊ณ , ๊ฐ ํฌ๋„์ฃผ ์ž”์— ๋“ค์–ด์žˆ๋Š” ํฌ๋„์ฃผ์˜ ์–‘์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๋งŽ์€ ์–‘์˜ ํฌ๋„์ฃผ๋ฅผ ๋งˆ์‹ค ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

D[i][j] = A[1]~A[n]๊นŒ์ง€ ํฌ๋„์ฃผ๋ฅผ ๋งˆ์…ง์„ ๋•Œ ๋งˆ์‹ค ์ˆ˜ ์žˆ๋Š” ํฌ๋„์ฃผ์˜ ์ตœ๋Œ€ ์–‘

  • 0๋ฒˆ์—ฐ์† : A[i]๋ฅผ ๋งˆ์‹œ์ง€ ์•Š์Œ

    • max(D[i-1][0],D[i-1][1],D[i-1][2])

  • 1๋ฒˆ์—ฐ์† : A[i-1]์„ ๋งˆ์‹œ์ง€ ์•Š์Œ.

    • D[i-1][0]+A[i]

  • 2๋ฒˆ์—ฐ์† : A[i-1]๋งˆ์‹œ๊ณ , A[i-2]๋งˆ์‹œ์ง€ ์•Š์Œ

    • D[i-1][1]+A[i]

#include <iostream>
using namespace std;

int d[10001][3];
int main(){
    int n;
    scanf("%d",&n);

    int g[n];

    for(int i=1;i<=n;i++){
        scanf("%d",&g[i]);
    }

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

    for(int i=1;i<=n;i++){
        d[i][0]= max(max(d[i-1][0],d[i-1][1]),d[i-1][2]);
        d[i][1]= d[i-1][0]+g[i];
        d[i][2]= d[i-1][1]+g[i];
    }
    printf("%d",max(max(d[n][0],d[n][1]),d[n][2]));
}

D[i] = A[1]~A[n]๊นŒ์ง€ ํฌ๋„์ฃผ๋ฅผ ๋งˆ์…ง์„ ๋•Œ ๋งˆ์‹ค ์ˆ˜ ์žˆ๋Š” ํฌ๋„์ฃผ์˜ ์ตœ๋Œ€ ์–‘

  • 0๋ฒˆ์—ฐ์† : A[i]๋ฅผ ๋งˆ์‹œ์ง€ ์•Š์Œ

    • D[i-1]

  • 1๋ฒˆ์—ฐ์† : A[i-1]์„ ๋งˆ์‹œ์ง€ ์•Š์Œ.

    • D[i-2]+A[i]

  • 2๋ฒˆ์—ฐ์† : A[i-1]๋งˆ์‹œ๊ณ , A[i-2]๋งˆ์‹œ์ง€ ์•Š์Œ

    • D[i-3]+A[i-1]+A[i]

=> D[i]=max(D[i-1], D[i-2]+A[i], D[i-3]+A[i-1]+A[i])

d[0]=0;
d[1]=g[1];
d[2]=g[1]+g[2];

for(int i=3;i<=n;i++){
    d[i]= max(max(d[i-1],d[i-2]+g[i]),d[i-3]+g[i]+g[i-1]);
}

๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ) ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋Š” 4์ด๋‹ค.

D[i]= A[1]~A[n]๊นŒ์ง€ ์ˆ˜์—ด์ด ์žˆ์„ ๋•Œ, A[i]๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•˜๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด(A[i]๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผํ•œ๋‹ค.)

#include <iostream>
using namespace std;

int d[1001];
int main(){
    int n; //์ˆ˜์—ด์˜ ํฌ๊ธฐ
    scanf("%d",&n);

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

    for(int i=0;i<n;i++){
        d[i]=1;
        for(int j=0;j<i;j++){
            if(a[i]>a[j]&&d[i]<d[j]+1)d[i]=d[j]+1;
        }
    }
    int maxd=0;
    for(int i=0;i<n;i++){
        if(maxd<d[i])maxd=d[i];
    }
    printf("%d",maxd);
}

๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ) ์ˆ˜์—ด A = {10, 30, 10, 20, 20, 10} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 30, 10, 20, 20, 10} ์ด๊ณ , ๊ธธ์ด๋Š” 3์ด๋‹ค.

D[i]= A[1]~A[n]๊นŒ์ง€ ์ˆ˜์—ด์ด ์žˆ์„ ๋•Œ, A[i]๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•˜๋Š” ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด(A[i]๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผํ•œ๋‹ค.)

#include <iostream>
using namespace std;

int d[1001];
int main(){
    int n; //์ˆ˜์—ด์˜ ํฌ๊ธฐ
    scanf("%d",&n);

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

    for(int i=0;i<n;i++){
        d[i]=1;
        for(int j=0;j<i;j++){
            if(a[i]<a[j]&&d[i]<d[j]+1)d[i]=d[j]+1;
        }
    }
    int maxd=0;
    for(int i=0;i<n;i++){
        if(maxd<d[i])maxd=d[i];
    }
    printf("%d",maxd);
}

๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด

์ˆ˜์—ด S๊ฐ€ ์–ด๋–ค ์ˆ˜ Sk๋ฅผ ๊ธฐ์ค€์œผ๋กœ S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด, ๊ทธ ์ˆ˜์—ด์„ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

์˜ˆ) {10, 20, 30, 25, 20}๊ณผ {10, 20, 30, 40}, {50, 40, 25, 10} ์€ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด์ง€๋งŒ, {1, 2, 3, 2, 1, 2, 3, 2, 1}๊ณผ {10, 20, 30, 40, 20, 30} ์€ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด ์•„๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด(D1)๊ณผ ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด(D2)๋ฅผ ๊ตฌํ•œ๋‹ค์Œ D1+D2-1์„ ๊ตฌํ•˜๋ฉด๋œ๋‹ค.

#include <stdio.h>
/*
 ์ˆ˜์—ด S๊ฐ€ ์–ด๋–ค ์ˆ˜ Sk๋ฅผ ๊ธฐ์ค€์œผ๋กœ S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด, ๊ทธ ์ˆ˜์—ด์„ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

 ์˜ˆ๋ฅผ ๋“ค์–ด, {10, 20, 30, 25, 20}๊ณผ {10, 20, 30, 40}, {50, 40, 25, 10} ์€ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด์ง€๋งŒ,  {1, 2, 3, 2, 1, 2, 3, 2, 1}๊ณผ {10, 20, 30, 40, 20, 30} ์€ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด ์•„๋‹ˆ๋‹ค.

 ์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ์ˆ˜์—ด์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด๋ฉด์„œ ๊ฐ€์žฅ ๊ธด ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 ์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N์ด ์ฃผ์–ด์ง€๊ณ , ๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด A๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 1,000, 1 โ‰ค Ai โ‰ค 1,000)
 */
int d[1001];
int d2[1001];
int main() {
    int n;
    scanf("%d",&n);
    int a[n+1];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<n;i++){
        d[i]=1;
        for(int j=0;j<=i;j++){
            if(a[i]>a[j]&&d[i]<d[j]+1){
                d[i]=d[j]+1;
            }
        }
    }
    for (int i=n-1; i>=0; i--) {
        d2[i] = 1;
        for (int j=i+1; j<n; j++) {
            if (a[i] > a[j] && d2[j]+1 > d2[i]) {
                d2[i] = d2[j]+1;
            }
        }
    }
    int ans =0 ;
    for(int i=0;i<n;i++){
        if(ans<d[i]+d2[i]-1){
           ans=d[i]+d2[i]-1;
        }
    }

    printf("%d",ans);
    return 0;
}

์—ฐ์†ํ•ฉ

n๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ž„์˜์˜ ์ˆ˜์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ์ค‘ ์—ฐ์†๋œ ๋ช‡ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์„ ํƒํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•ฉ ์ค‘ ๊ฐ€์žฅ ํฐ ํ•ฉ์„ ๊ตฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋‹จ, ์ˆซ์ž๋Š” ํ•œ ๊ฐœ ์ด์ƒ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ) 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 ์ด๋ผ๋Š” ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•˜์ž. ์—ฌ๊ธฐ์„œ ์ •๋‹ต์€ 12+21์ธ 33์ด ์ •๋‹ต์ด ๋œ๋‹ค.

D[i]=A[i]๋กœ ๋๋‚˜๋Š” ์ตœ๋Œ€ ์—ฐ์†ํ•ฉ

  • A[i-1]๋กœ ๋๋‚˜๋Š” ์—ฐ์†ํ•ฉ์— ํฌํ•จ D[i-1]+A[i]

  • ์ƒˆ๋กœ์šด ์—ฐ์†ํ•ฉ ์‹œ์ž‘ A[i]

#include <iostream>
using namespace std;

int d[100001]; //A[i]๋กœ ๋๋‚˜๋Š” ์ตœ๋Œ€ ์—ฐ์†ํ•ฉ

int main(){
    int n; //์—ฐ์†๋œ ์ˆซ์ž์˜ ์ˆ˜
    scanf("%d",&n);

    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    d[0]=a[0];
    for(int i=1;i<n;i++){
        d[i]=max(d[i-1]+a[i],a[i]);
    }
    int ans=d[0];
    for(int i=1;i<n;i++){
        if(ans<d[i])ans=d[i];
    }
    printf("%d",ans);
}

๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ

๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ ๊ฒŒ์ž„์€ ๊ณ„๋‹จ ์•„๋ž˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ๊ณ„๋‹จ ๊ผญ๋Œ€๊ธฐ์— ์œ„์น˜ํ•œ ๋„์ฐฉ์ ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒŒ์ž„์ด๋‹ค. ๊ฐ๊ฐ์˜ ๊ณ„๋‹จ์—๋Š” ์ผ์ •ํ•œ ์ ์ˆ˜๊ฐ€ ์“ฐ์—ฌ ์žˆ๋Š”๋ฐ ๊ณ„๋‹จ์„ ๋ฐŸ์œผ๋ฉด ๊ทธ ๊ณ„๋‹จ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ ์ˆ˜๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค.

  1. ๊ณ„๋‹จ์€ ํ•œ ๋ฒˆ์— ํ•œ ๊ณ„๋‹จ์”ฉ ๋˜๋Š” ๋‘ ๊ณ„๋‹จ์”ฉ ์˜ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ•œ ๊ณ„๋‹จ์„ ๋ฐŸ์œผ๋ฉด์„œ ์ด์–ด์„œ ๋‹ค์Œ ๊ณ„๋‹จ์ด๋‚˜, ๋‹ค์Œ ๋‹ค์Œ ๊ณ„๋‹จ์œผ๋กœ ์˜ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

  2. ์—ฐ์†๋œ ์„ธ ๊ฐœ์˜ ๊ณ„๋‹จ์„ ๋ชจ๋‘ ๋ฐŸ์•„์„œ๋Š” ์•ˆ๋œ๋‹ค. ๋‹จ, ์‹œ์ž‘์ ์€ ๊ณ„๋‹จ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

  3. ๋งˆ์ง€๋ง‰ ๋„์ฐฉ ๊ณ„๋‹จ์€ ๋ฐ˜๋“œ์‹œ ๋ฐŸ์•„์•ผ ํ•œ๋‹ค.

    ๋”ฐ๋ผ์„œ ์ฒซ ๋ฒˆ์งธ ๊ณ„๋‹จ์„ ๋ฐŸ๊ณ  ์ด์–ด ๋‘ ๋ฒˆ์งธ ๊ณ„๋‹จ์ด๋‚˜, ์„ธ ๋ฒˆ์งธ ๊ณ„๋‹จ์œผ๋กœ ์˜ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ฒซ ๋ฒˆ์งธ ๊ณ„๋‹จ์„ ๋ฐŸ๊ณ  ์ด์–ด ๋„ค ๋ฒˆ์งธ ๊ณ„๋‹จ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€๊ฑฐ๋‚˜, ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ, ์„ธ๋ฒˆ์งธ ๊ณ„๋‹จ์„ ์—ฐ์†ํ•ด์„œ ๋ชจ๋‘ ๋ฐŸ์„ ์ˆ˜๋Š” ์—†๋‹ค.

D[i][j]=i๋ฒˆ์งธ ๊ณ„๋‹จ์— ์˜ฌ๋ž์„ ๋•Œ ์ด ์ ์ˆ˜์˜ ์ตœ๋Œ€๊ฐ’. (i๋ฒˆ์งธ ๊ณ„๋‹จ์€ j๊ฐœ ์—ฐ์†ํ•ด์„œ ์˜ค๋ฅธ ๊ณ„๋‹จ)

  • D[i][0]=0๊ฐœ์—ฐ์†(i๋ฒˆ์งธ ๊ณ„๋‹จ์— ์˜ฌ๋ผ๊ฐ€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)

  • D[i][1]=1๊ฐœ์—ฐ์†(i-1์€ ๋ฐŸ์œผ๋ฉด ์•ˆ๋œ๋‹ค.)=max(D[i-2][1],D[i-2][2])+a[i]

  • D[i][2]=2๊ฐœ์—ฐ์†(i๋ฒˆ์งธ ๊ณ„๋‹จ์€ ๋ฐŸ์•„์•ผํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ 1๊ฐœ ์—ฐ์†ํ•ด์„œ ์˜ฌ๋ผ์˜จ ๊ณ„๋‹จ์ด์–ด์•ผํ•œ๋‹ค.)=D[i-1][1]+a[i]

#include <iostream>
using namespace std;

int d[301][3]; //A[i]๋กœ ๋๋‚˜๋Š” ์ตœ๋Œ€ ์ ์ˆ˜

int main(){
    int n; //๊ณ„๋‹จ์ˆ˜
    scanf("%d",&n);

    int a[n];//๊ฐ ๊ณ„๋‹จ ์ ์ˆ˜
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    d[0][1]=a[0];
    d[1][1]=a[1];
    d[1][2]=a[1]+a[0];
    for(int i=2;i<n;i++){
        d[i][1]=max(d[i-2][1],d[i-2][2])+a[i];
        d[i][2]=d[i-1][1]+a[i];
    }
    printf("%d",max(d[n-1][1],d[n-1][2]));
}

์ด๋•Œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ๋ฐ–์œผ๋กœ ๋นผ์ค€๋‹ค๋ฉด 2์ฐจ์›์—์„œ 1์ฐจ์›์œผ๋กœ ์ฐจ์›์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

D[i]=i๋ฒˆ์งธ ๊ณ„๋‹จ์— ์˜ฌ๋ผ๊ฐ”์„ ๋•Œ, ์ตœ๋Œ€ ์ ์ˆ˜

  • 1๊ฐœ ์—ฐ์† : i-1๋ฒˆ์งธ ๊ณ„๋‹จ์€ ๋ฐŸ์œผ๋ฉด ์•ˆ๋จ

    • i-2๋Š” ๋ฐ˜๋“œ์‹œ ๋ฐŸ์•˜์–ด์•ผ ํ•จ

    • D[i-2]+A[i]

  • 2๊ฐœ ์—ฐ์† : i-1๋ฒˆ์งธ ๊ณ„๋‹จ์€ ๋ฐŸ๊ณ , i-2๋Š” ๋ฐŸ์œผ๋ฉด ์•ˆ๋จ

    • i-3๋ฒˆ์งธ ๊ณ„๋‹จ์€ ๋ฐ˜๋“œ์‹œ ๋ฐŸ์•„์•ผ ํ•จ

    • D[i-3]+A[i-1]+A[i]

#include <iostream>
using namespace std;

int d[301]; //A[i]๋กœ ๋๋‚˜๋Š” ์ตœ๋Œ€ ์ ์ˆ˜
int a[301];//๊ฐ ๊ณ„๋‹จ ์ ์ˆ˜
int main(){
    int n; //๊ณ„๋‹จ์ˆ˜
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    d[1]=a[1];
    d[2]=a[1]+a[2];

    for(int i=3;i<=n;i++){
        d[i]=max(d[i-2]+a[i],d[i-3]+a[i-1]+a[i]);
    }
    printf("%d",d[n]);
}

์ œ๊ณฑ์ˆ˜์˜ ํ•ฉ

์–ด๋–ค ์ž์—ฐ์ˆ˜ N์€ ๊ทธ๋ณด๋‹ค ์ž‘์€ ์ œ๊ณฑ์ˆ˜๋“ค์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 11=3^2+1^2+1^2(3๊ฐœ ํ•ญ)์ด๋‹ค. ์ด๋Ÿฐ ํ‘œํ˜„๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, 11์˜ ๊ฒฝ์šฐ 11=2^2+2^2+1^2+1^2+1^2(5๊ฐœ ํ•ญ)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๊ฒฝ์šฐ, ์ˆ˜ํ•™์ž ์ˆŒํฌ๋ผํ…Œ์Šค๋Š” โ€œ11์€ 3๊ฐœ ํ•ญ์˜ ์ œ๊ณฑ์ˆ˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.โ€๋ผ๊ณ  ๋งํ•œ๋‹ค. ๋˜ํ•œ 11์€ ๊ทธ๋ณด๋‹ค ์ ์€ ํ•ญ์˜ ์ œ๊ณฑ์ˆ˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, 11์„ ๊ทธ ํ•ฉ์œผ๋กœ์จ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ œ๊ณฑ์ˆ˜ ํ•ญ์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋Š” 3์ด๋‹ค.

D[i]=์ž์—ฐ์ˆ˜ N์„ ์ด๋ ‡๊ฒŒ ์ œ๊ณฑ์ˆ˜๋“ค์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ๋•Œ์— ๊ทธ ํ•ญ์˜ ์ตœ์†Œ๊ฐœ์ˆ˜

  • ๋งˆ์ง€๋ง‰ํ•ญ์ด ์ค‘์š”ํ•˜๋‹ค.

  • min(D[i-j^2]+1) (1<=i<=j^2)

#include <iostream>
using namespace std;

int d[100001]; //์ œ๊ณฑํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์ตœ์†Œํ•ญ ๊ฐœ์ˆ˜
int main(){
    int n; //์ž์—ฐ์ˆ˜
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        d[i]=i; //1^2์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฐœ์ˆ˜(์ฆ‰, ์ตœ๋Œ€ํ•ญ)
        for(int j=1;j*j<=i;j++){
            if(d[i]>d[i-j*j]+1)d[i]=d[i-j*j]+1;
        }
    }
    printf("%d",d[n]);
}

ํƒ€์ผ ์ฑ„์šฐ๊ธฐ

3ร—N ํฌ๊ธฐ์˜ ๋ฒฝ์„ 2ร—1, 1ร—2 ํฌ๊ธฐ์˜ ํƒ€์ผ๋กœ ์ฑ„์šฐ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด๋ณด์ž.

D[i]=3Xi๋ฅผ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜

  • D[i]=3*D[i-2]+2*D[i-4]+2*D[i-6]+...

#include <iostream>
using namespace std;

int d[31]; //3*i๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
int main(){
    int n;
    scanf("%d",&n);
    d[0]=1;
    for (int i=2; i<=n; i+=2) {
        d[i] = d[i-2]*3;
        for (int j=i-4; j>=0; j-=2) {
            d[i] += d[j]*2;
        }
    }
    printf("%d",d[n]);
}

ํŒŒ๋„๋ฐ˜ ์ˆ˜์—ด

๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์‚ผ๊ฐํ˜•์ด ๋‚˜์„  ๋ชจ์–‘์œผ๋กœ ๋†“์—ฌ์ ธ ์žˆ๋‹ค. ์ฒซ ์‚ผ๊ฐํ˜•์€ ์ •์‚ผ๊ฐํ˜•์œผ๋กœ ๋ณ€์˜ ๊ธธ์ด๋Š” 1์ด๋‹ค. ๊ทธ ๋‹ค์Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ์ •์‚ผ๊ฐํ˜•์„ ๊ณ„์† ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‚˜์„ ์—์„œ ๊ฐ€์žฅ ๊ธด ๋ณ€์˜ ๊ธธ์ด๋ฅผ k๋ผ ํ–ˆ์„ ๋•Œ, ๊ทธ ๋ณ€์— ๊ธธ์ด๊ฐ€ k์ธ ์ •์‚ผ๊ฐํ˜•์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

ํŒŒ๋„๋ฐ˜ ์ˆ˜์—ด P(N)์€ ๋‚˜์„ ์— ์žˆ๋Š” ์ •์‚ผ๊ฐํ˜•์˜ ๋ณ€์˜ ๊ธธ์ด์ด๋‹ค. P(1)๋ถ€ํ„ฐ P(10)๊นŒ์ง€ ์ฒซ 10๊ฐœ ์ˆซ์ž๋Š” 1, 1, 1, 2, 2, 3, 4, 5, 7, 9์ด๋‹ค.

N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, P(N)์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

D[i]=P(i)ํŒŒ๋„๋ฐ˜ ์ˆ˜์—ด

  • D[i-2]+D[i-3]

  • D[i-5]+D[i-1]

#include <iostream>
using namespace std;

int d[101]; //ํŒŒ๋„๋ฐ˜์ˆ˜์—ด
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        d[0]=0;
        d[1]=d[2]=1;
        for (int i=3; i<=n; i++) {
            d[i] = d[i-2]+d[i-3];
        }
        printf("%d\n",d[n]);
    }
}

ํ•ฉ๋ถ„ํ•ด

0๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ •์ˆ˜ K๊ฐœ๋ฅผ ๋”ํ•ด์„œ ๊ทธ ํ•ฉ์ด N์ด ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๋ง์…ˆ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋กœ ์„ผ๋‹ค(1+2์™€ 2+1์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ์šฐ). ๋˜ํ•œ ํ•œ ๊ฐœ์˜ ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค.

D[K][N]=์ •์ˆ˜ 0๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ •์ˆ˜ K๊ฐœ๋ฅผ ๋”ํ•ด์„œ N์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜

  • +=D[K-1][N-L] (0<=L<=N)

#include <iostream>
using namespace std;

long long int d[201][201]; //ํ•ฉ๋ถ„ํ•ด
int main(){
    int n,k;
    scanf("%d %d",&k,&n);
    d[0][0]=1LL;
    for(int i=1;i<=k;i++){
        for(int j=0;j<=n;j++){
            for(int l=0;l<=j;l++){
                d[i][j]+=d[i-1][j-l];
                d[i][j]%=1000000000;
            }
        }
    }
    printf("%lld",d[k][n]);
}

์•”ํ˜ธ ์ฝ”๋“œ

์ƒ๊ทผ: ๊ทธ๋ƒฅ ๊ฐ„๋‹จํžˆ ์•”ํ˜ธํ™” ํ•˜์ž. A๋ฅผ 1์ด๋ผ๊ณ  ํ•˜๊ณ , B๋Š” 2๋กœ, ๊ทธ๋ฆฌ๊ณ  Z๋Š” 26์œผ๋กœ ํ•˜๋Š”๊ฑฐ์•ผ. ์„ ์˜: ๊ทธ๋Ÿผ ์•ˆ๋ผ. ๋งŒ์•ฝ, "BEAN"์„ ์•”ํ˜ธํ™”ํ•˜๋ฉด 25114๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ์ด๊ฑธ ๋‹ค์‹œ ๊ธ€์ž๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์–ด. ์ƒ๊ทผ: ๊ทธ๋ ‡๋„ค. 25114๋ฅผ ๋‹ค์‹œ ์˜์–ด๋กœ ๋ฐ”๊พธ๋ฉด, "BEAAD", "YAAD", "YAN", "YKD", "BEKD", "BEAN" ์ด 6๊ฐ€์ง€๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, BEAN์ด ๋งž๋Š” ๋‹จ์–ด๋ผ๋Š”๊ฑด ์‰ฝ๊ฒŒ ์•Œ์ˆ˜ ์žˆ์ž–์•„? ์„ ์˜: ์˜ˆ๊ฐ€ ์ ์ ˆํ•˜์ง€ ์•Š์•˜๋„ค ใ… ใ…  ๋งŒ์•ฝ ๋‚ด๊ฐ€ 500์ž๋ฆฌ ๊ธ€์ž๋ฅผ ์•”ํ˜ธํ™” ํ–ˆ๋‹ค๊ณ  ํ•ด๋ด. ๊ทธ ๋•Œ๋Š” ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ํ•ด์„์ด ์ •๋ง ๋งŽ์€๋ฐ, ๊ทธ๊ฑธ ์–ธ์ œ ๋‹คํ•ด๋ด? ์ƒ๊ทผ: ์–ผ๋งˆ๋‚˜ ๋งŽ์€๋ฐ? ์„ ์˜: ๊ตฌํ•ด๋ณด์ž! ์–ด๋–ค ์•”ํ˜ธ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ์•”ํ˜ธ์˜ ํ•ด์„์ด ๋ช‡ ๊ฐ€์ง€๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

D[i]=i๋ฒˆ์งธ ๋ฌธ์ž๊นŒ์ง€ ํ•ด์„ํ–ˆ์„ ๋•Œ, ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ํ•ด์„์˜ ๊ฐ€์ง“ ์ˆ˜

  • 1์ž๋ฆฌ ์•”ํ˜ธ(0์ œ์™ธ)

  • 2์ž๋ฆฌ ์•”ํ˜ธ(10~26)

Last updated