ํฌ์ŠคํŠธ

๐Ÿ” DP

๐Ÿ” DP

๐Ÿ“Œ 1. DP, DPS, BFS ์‹œ๊ฐ„ ๋น„๊ต

๋ฐฑ์ค€ 1463๋ฒˆ

Dp : 4ms, ๋ฉ”๋ชจ๋ฆฌ : 4900 KB

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>

#define N_MAX 1000001
#define Min(a,b) ((a<b)?a:b)

int main() {
	int N;
	scanf("%d", &N);

	
	int dp[N_MAX];
	
	dp[1] = 0;

	for (int i = 2;i <= N;i++) {
		//๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๋กœ ์ดˆ๊ธฐํ™”
		//์…‹ ์ค‘ ์ตœ์†Œ ํšŸ์ˆ˜๋กœ dp๋ฐฐ์—ด์— ์‚ฝ์ž…
		dp[i] = dp[i - 1] + 1;
		if (i % 2 == 0) dp[i] = Min(dp[i], dp[i / 2] + 1);
		if (i % 3 == 0) dp[i] = Min(dp[i], dp[i / 3] + 1);

		//printf("dp[%d] : %d\n", i, dp[i]);
	}

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

	return 0;
}


my_Dfs : 64ms, ๋ฉ”๋ชจ๋ฆฌ : 51772 KB

์ฝ”๋“œ ๋ณด๊ธฐ
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 <stdio.h>
#include <limits.h>

#define MAX_N 1000000

int min_step = INT_MAX; // ์ตœ์†Œ ์—ฐ์‚ฐ ์ˆ˜ ์ €์žฅ
int visited[MAX_N + 1] = { 0 }; // ๊ฐ ๊ฐ’์˜ ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜ ๊ธฐ๋ก

void dfs(int n, int step) {

    //printf("cur : %d | step : %d\n", n, step);
    // ์ˆซ์ž๊ฐ€ 1์ด๋ฉด ์ตœ์†Œ ์—ฐ์‚ฐ ์ˆ˜ ๊ฐฑ์‹ 
    if (n == 1) {
        if (step < min_step) {
            min_step = step;
        }
        return;
    }

    //์‹œ๊ฐ„ ์ค„์ด๊ธฐ ์œ„ํ•œ
    // ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๊ฑฐ๋‚˜, ํ˜„์žฌ ์—ฐ์‚ฐ์ด ์ตœ์†Œ ์—ฐ์‚ฐ ์ด์ƒ์ธ ๊ฒฝ์šฐ ํƒ์ƒ‰ ์ค‘๋‹จ
    if (visited[n] && step >= visited[n]) {
        return;
    }
    visited[n] = step; // ํ˜„์žฌ ์ƒํƒœ ๋ฐฉ๋ฌธ ๊ธฐ๋ก


    // ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ ์ˆ˜ํ–‰
    if (n % 3 == 0) {
        dfs(n / 3, step + 1);
    }
    if (n % 2 == 0) {
        dfs(n / 2, step + 1);
    }
    dfs(n - 1, step + 1); // ํ•ญ์ƒ ๊ฐ€๋Šฅ
}

int main() {
    int N;
    scanf("%d", &N);

    dfs(N, 0);

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

    return 0;
}


Dfs : 8ms, ๋ฉ”๋ชจ๋ฆฌ : 5016 KB

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include <stdio.h>
#include <limits.h>

#define MAX_N 1000000

int min_step = INT_MAX; // ์ตœ์†Œ ์—ฐ์‚ฐ ์ˆ˜ ์ €์žฅ
int visited[MAX_N + 1] = {0}; // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ๊ธฐ๋ก

void dfs(int n, int step) {

    //printf("cur : %d | step : %d\n", n, step);
    // ์ˆซ์ž๊ฐ€ 1์ด๋ฉด ์ตœ์†Œ ์—ฐ์‚ฐ ์ˆ˜ ๊ฐฑ์‹ 
    if (n == 1) {
        if (step < min_step) {
            min_step = step;
        }
        return;
    }

    // ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๊ฑฐ๋‚˜, ํ˜„์žฌ ์—ฐ์‚ฐ์ด ์ตœ์†Œ ์—ฐ์‚ฐ ์ด์ƒ์ธ ๊ฒฝ์šฐ ํƒ์ƒ‰ ์ค‘๋‹จ
    if (visited[n] && step >= visited[n]) {
        return;
    }

    visited[n] = step; // ํ˜„์žฌ ์ƒํƒœ ๋ฐฉ๋ฌธ ๊ธฐ๋ก

    // ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ ์ˆ˜ํ–‰
    if (n % 3 == 0) {
        dfs(n / 3, step + 1);
    }
    if (n % 2 == 0) {
        dfs(n / 2, step + 1);
    }
    dfs(n - 1, step + 1); // ํ•ญ์ƒ ๊ฐ€๋Šฅ
}

int main() {
    int N;
    scanf("%d", &N);

    dfs(N, 0);

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

    return 0;
}


BFS : 0ms, ๋ฉ”๋ชจ๋ฆฌ : 9784 KB

์ฝ”๋“œ ๋ณด๊ธฐ
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
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX_N 1000000

typedef struct {
    int n;      // ํ˜„์žฌ ์ˆซ์ž
    int step;   // ํ˜„์žฌ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•œ ์—ฐ์‚ฐ ์ˆ˜
} Node;

int bfs(int start) {
    bool visited[MAX_N + 1] = {false}; // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ๊ธฐ๋ก
    Node queue[MAX_N];
    int front = 0, rear = 0;

    // ์ดˆ๊ธฐ ์ƒํƒœ ์‚ฝ์ž…
    queue[rear++] = (Node) {start, 0};
    visited[start] = true;

    while (front < rear) {
        Node cur = queue[front++];
        
        // ์ˆซ์ž๊ฐ€ 1์ด ๋˜๋ฉด ์ตœ์†Œ ๋‹จ๊ณ„๋ฅผ ๋ฐ˜ํ™˜
        if (cur.n == 1) {
            return cur.step;
        }

        // ๊ฐ€๋Šฅํ•œ ๋‹ค์Œ ์ƒํƒœ ์‚ฝ์ž…
        if (cur.n % 3 == 0 && !visited[cur.n / 3]) {
            queue[rear++] = (Node) {cur.n / 3, cur.step + 1};
            visited[cur.n / 3] = true;
        }
        if (cur.n % 2 == 0 && !visited[cur.n / 2]) {
            queue[rear++] = (Node) {cur.n / 2, cur.step + 1};
            visited[cur.n / 2] = true;
        }
        if (cur.n - 1 > 0 && !visited[cur.n - 1]) {
            queue[rear++] = (Node) {cur.n - 1, cur.step + 1};
            visited[cur.n - 1] = true;
        }
    }

    return -1; // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
}

int main() {
    int N;
    scanf("%d", &N);

    int result = bfs(N);
    printf("%d\n", result);

    return 0;
}



๐Ÿ“Œ 2. ์‚ฌ์น™์—ฐ์‚ฐ DP

๋ฐฑ์ค€ 9095๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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>

#define MAX 11

int dp[MAX];

void sol() {
	dp[1] = 1;	// 1
	dp[2] = 2;	// 1+1, 2
	dp[3] = 4;	// 1+1+1, 1+2, 2+1, 3

	for (int i = 4;i < MAX;i++) {
		dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
	}
}
int main() {
	int T;
	scanf("%d", &T);

	sol();

	for (int i = 0;i < T;i++) {
		int n;
		scanf("%d", &n);

		int res = dp[n];
		printf("%d\n", res);
	}

	return 0;
}


์ดˆ๊ธฐ๊ฐ’ : dp[1], dp[2], dp[3] ์ ํ™”์‹ : dp[i] = dp[i-1] + dp[i-2] + dp[i-3]


๐Ÿ“Œ 3. ๊ณ„๋‹จ ์˜ค๋ฅด๋ฉด์„œ ์ ์ˆ˜ ๋”ฐ๊ธฐ DP

๋ฐฑ์ค€ 2579๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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<stdio.h>

#define MAX 301
#define Max(a,b) ((a>b)?a:b)

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

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

	int dp[MAX];

	// ์—ฐ์†๋œ ์„ธ ๊ฐœ์˜ ๊ณ„๋‹จ์„ ๋ชจ๋‘ ๋ฐŸ์œผ๋ฉด ์•ˆ๋˜๊ธฐ์—
	dp[1] = score[1];
	dp[2] = score[2] + score[1];
	int temp1 = score[1] + score[3];
	int temp2 = score[2] + score[3];
	dp[3] = Max(temp1, temp2);

	for (int i = 4;i <= n;i++) {
		// 1) ๋‚ฎ์€,		๋†’์€, ๋‹ค์Œ
		// 2)		์ค‘๊ฐ„,	  ๋‹ค์Œ
		temp1 = dp[i - 3] + score[i - 1] + score[i];
		temp2 = dp[i - 2] + score[i];
		dp[i] = Max(temp1, temp2);
		//printf(" temp1 : %d | temp2 : %d\n", temp1, temp2);
		//printf("dp[%d] : %d\n", i, dp[i]);
	}
	printf("%d\n", dp[n]);

	return 0;
}



๐Ÿ“Œ 4. ์ตœ์†Œ ๋น„์šฉ ๊ณ„์‚ฐ (์ง‘ RGB ์ƒ‰์น ํ•˜๊ธฐ)

๋ฐฑ์ค€ 1149๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>

#define MAX 1001
//#define Min(a,b) ((a<b)?a:b)

int Min(int a, int b) {
	int temp = a < b ? a : b;
	return temp;
}
int main() {
	int N;
	scanf("%d", &N);

	int dp[MAX][3];
	int cost[MAX][3];
	for (int i = 1;i <= N;i++) {
		scanf("%d %d %d", &cost[i][0], &cost[i][1], &cost[i][2]);
	}

	// DP ์ดˆ๊ธฐ๊ฐ’ : 1๋ฒˆ์ง‘ 3๊ฐ€์ง€ ๊ฒฝ์šฐ
	for (int i = 0;i < 3;i++) {
		dp[1][i] = cost[1][i];
	}
	
	// DP ์ ํ™”์‹
	// ํ˜„์žฌ ๊ฐ ์ƒ‰์˜ ์ตœ์†Œ ๋น„์šฉ = ํ˜„์žฌ ์ƒ‰ ๋น„์šฉ + ์ด์ „ ๋‹ค๋ฅธ์ƒ‰ ์ตœ์†Œ ๋น„์šฉ
	for (int i = 2;i <= N;i++) {
		dp[i][0] = cost[i][0] + Min(dp[i - 1][1], dp[i - 1][2]);	// R
		dp[i][1] = cost[i][1] + Min(dp[i - 1][0], dp[i - 1][2]);	// G
		dp[i][2] = cost[i][2] + Min(dp[i - 1][0], dp[i - 1][1]);	// B
	}

	int res = Min(dp[N][0], Min(dp[N][1], dp[N][2]));
	printf("%d\n", res);

	return 0;
}



๐Ÿ“Œ 5. 2xn ์ง์‚ฌ๊ฐํ˜• ์ฑ„์šฐ๊ธฐ

๋ฐฑ์ค€ 11726๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>

#define MAX 1001
#define MOD 10007

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

	// dp[i] 2xi ์˜ ์ง์‚ฌ๊ฐํ˜•
	int dp[MAX];

	// ์ดˆ๊ธฐ๊ฐ’
	dp[1] = 1;	// ์„ธ๋กœ 1
	dp[2] = 2;	// ์„ธ๋กœ 2 or ๊ฐ€๋กœ 2

	for (int i = 3;i <= n;i++) {
		// dp[i-1] : ์ง์‚ฌ๊ฐํ˜• 1์นธ์„ ๋” ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ด์ „ ์ƒํƒœ์—์„œ 1x2 ์ถ”๊ฐ€ํ•œ ๋ฐฉ๋ฒ•
        // dp[i-2] : ์ง์‚ฌ๊ฐํ˜• 2์นธ์„ ๋” ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ด์ „ ์ƒํƒœ์—์„œ 2x2 ์ถ”๊ฐ€ํ•œ ๋ฐฉ๋ฒ•
		dp[i] = (dp[i - 1] + dp[i - 2]) % MOD;
	}

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

	return 0;
}



๐Ÿ“Œ 6. ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ

๋ฐฑ์ค€ 11659๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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<stdio.h>

#define MAX 100001

int main() {

	int N, M;
	scanf("%d %d", &N, &M);

	int num[MAX];

	// dp[i] : 1๋ฒˆ์งธ๋ถ€ํ„ฐ i๋ฒˆ์งธ๊นŒ์ง€์˜ ํ•ฉ
	int dp[MAX];
	int sum = 0;
	for (int i = 1;i <= N;i++) {
		scanf("%d", &num[i]);
		sum += num[i];
		dp[i] = sum;
	}

	for (int i = 0;i < M;i++) {
		int a, b;
		scanf("%d %d", &a, &b);

		// a๋ฒˆ์งธ ~ b๋ฒˆ์งธ๊นŒ์ง€ ํ•ฉ
		printf("%d\n", dp[b] - dp[a] + num[a]);
	}

	return 0;
}



๐Ÿ“Œ 7. 1๋กœ ๋งŒ๋“ค๊ธฐ 2 : ์–ด๋””์„œ ์™”๋Š”์ง€ ๊ธฐ์–ต

๋ฐฑ์ค€ 12852๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>

#define MAX (1000001)
#define Min(a,b) ((a<b)?a:b)

int main() {
	int N;
	scanf("%d", &N);

    int dp[MAX] = { 0 }; // dp ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
    int prev[MAX];  //์–ด๋””์„œ ์™”๋Š”์ง€ ๊ธฐ์–ต

    int check = 0;
    for (int i = 2; i <= N; i++) {
        dp[i] = dp[i - 1] + 1; // 1์„ ๋บ€ ๊ฒฝ์šฐ
        prev[i] = i - 1;        //i-1์—์„œ ์˜ด

        if (i % 2 == 0) {
            if (dp[i] > dp[i / 2] + 1) {
                dp[i] = dp[i / 2] + 1;
                prev[i] = i / 2;    //i/2์—์„œ ์˜ด
            }
        }
        if (i % 3 == 0) {
            if (dp[i] > dp[i / 3] + 1) {
                dp[i] = dp[i / 3] + 1;
                prev[i] = i / 3;    //i/3์—์„œ ์˜ด
            }
        }
    }

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

    int i = N;
    while (i >= 1) {
        printf("%d ", i);
        i = prev[i];
    }

	return 0;
}



๐Ÿ“Œ 8. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด : dp[n]์€ 1์˜ ์ถœ๋ ฅ ํšŸ์ˆ˜, dp[n-1]์€ 0์˜ ์ถœ๋ ฅ ํšŸ์ˆ˜

๋ฐฑ์ค€ 1003๋ฒˆ๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
48
49
50
51
52
53
54
55
56
57
#include<stdio.h>
#include<stdbool.h>

#define MAX 41
int dp[MAX];
bool visited[MAX];

int fibonacci(int n) {
	if (n == 0) {
		printf("0");
		return 0;
	}
	else if (n == 1) {
		printf("1");
		return 1;
	}
	else {
		return fibonacci(n - 1) + fibonacci(n - 2);
	}
}
void fibo(int n) {
	for (int i = 2;i <= n;i++) {
		dp[i] = dp[i - 1] + dp[i - 2];
		visited[i] = 1;
		//printf("dp[%d] : %d\n", i, dp[i]);
	}
}
void print(int n) {
	if (n == 0)
		printf("%d %d\n", 1, 0);
	else 
		// 0 ์ถœ๋ ฅ ํšŸ์ˆ˜ : dp[n-1] , 1 ์ถœ๋ ฅ ํšŸ์ˆ˜ : dp[n]
		printf("%d %d\n", dp[n-1], dp[n]);
}
void init() {
	dp[0] = 0;
	dp[1] = 1;
	visited[0] = 1;
	visited[1] = 1;
}
int main() {
	int T;
	scanf("%d", &T);

	init();
	for (int i = 0;i < T;i++) {
		int n;
		scanf("%d", &n);

		if (!visited[n]) {
			fibo(n);
		}
		print(n);
	}

	return 0;
}



๐Ÿ“Œ 9. ์‚ผ๊ฐํ˜• ๋‚ด๋ ค๊ฐ€๋ฉฐ ๋”ํ•˜๊ธฐ

๋ฐฑ์ค€ 1932๋ฒˆ


๋ณต์žก

์ฝ”๋“œ ๋ณด๊ธฐ
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<stdio.h>

#define MAX 501
#define Maxab(a,b) ((a>b)?a:b)

typedef struct {
    int x;
    int y;
}Pos;

int dx[2] = { -1, -1 };
int dy[2] = { -1, 0 };
int map[MAX][MAX] = { 0 };

void print(int n, int dp[][MAX]) {
    for (int i = 0;i < n;i++) {
        for (int j = 0;j < (i + 1);j++) {
            printf("%d ", dp[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int n;
    scanf("%d", &n);
    
    for (int i = 0;i < n;i++) {
        for (int j = 0;j < (i + 1);j++) {
            scanf("%d", &map[i][j]);
        }
    }

    int dp[MAX][MAX] = {0};
    dp[0][0] = map[0][0];
    for (int i = 0;i < n;i++) {
        for (int j = 0;j < (i + 1);j++) {
            Pos cur = { i,j };
            for (int k = 0;k < 2;k++) {
                Pos prev = { cur.x + dx[k], cur.y + dy[k] };
                //printf("prev  : %d %d\n", prev.x, prev.y);
                if (prev.x >= 0 && prev.y >= 0 && prev.y < (i + 1)) {
                    dp[i][j] = Maxab(dp[i][j], dp[prev.x][prev.y]+map[i][j]);
                    //printf("dp[%d][%d]  : %d\n",i, j, dp[i][j]);
                }
            }

        }
    }
    
    //print(n, dp);

    int res = 0;
    for (int j = 0;j < n;j++) {
        res = Maxab(res, dp[n-1][j]);
    }
    printf("%d\n", res);


    return 0;
}


๋‹จ์ˆœ

์ฝ”๋“œ ๋ณด๊ธฐ
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
48
49
50
51
52
53
54
55
56
#include<stdio.h>

#define MAX 500
#define Maxab(a,b) ((a>b)?a:b)

int dp[MAX][MAX];
int tri[MAX][MAX];

void print(int n) {
    for (int i = 0;i < n;i++) {
        for (int j = 0;j < i + 1;j++) {
            printf("%d ", dp[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int n;
    scanf("%d", &n);

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

    // ์ดˆ๊ธฐ ๊ฐ’
    dp[0][0] = tri[0][0];

    // DP ํ…Œ์ด๋ธ” ์ฑ„์šฐ๊ธฐ
    for (int i = 1; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            if (j == 0) {   //์™ผ์ชฝ ๋
                dp[i][j] = dp[i - 1][j] + tri[i][j];
            }
            else {          //์ด์™ธ์—
                dp[i][j] = tri[i][j] + Maxab(dp[i - 1][j - 1], dp[i - 1][j]);
            }
        }
    }
    
    print(n);

    // ์ตœ๋Œ“๊ฐ’ ์ถœ๋ ฅ
    int max_sum = dp[n - 1][0];
    for (int j = 1; j < n; j++) {
        if (dp[n - 1][j] > max_sum) {
            max_sum = dp[n - 1][j];
        }
    }

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

    return 0;
}



๐Ÿ“Œ 10. 2xn ์ง์‚ฌ๊ฐํ˜• ์ฑ„์šฐ๊ธฐ2

๋ฐฑ์ค€ 11727๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>

#define MOD 10007
#define MAX 1001

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

	int dp[MAX] = { 0 };
	dp[1] = 1;
	dp[2] = 3;

	for (int i = 3;i <= n;i++) {
		//   dp[i-1] : ๊ฐ€๋กœ 1 ์žก์•„๋จน๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ : ์ง์‚ฌ๊ฐํ˜•์˜ ํ•œ์ชฝ์— 1x2 ์ถ”๊ฐ€
		// 2*dp[i-2] : ๊ฐ€๋กœ 2 ์žก์•„๋จน๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
		dp[i] = (dp[i - 1] + 2*dp[i - 2]) % MOD;
	}

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

	return 0;
}



๐Ÿ“Œ 11. ์ด์ฐฌ์ˆ˜ : 0์œผ๋กœ ๋๋‚˜๋Š” ์ˆ˜, 1๋กœ ๋๋‚˜๋Š” ์ˆ˜ ๋‚˜๋ˆ ์„œ ์ƒ๊ฐ

๋ฐฑ์ค€ 2193๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>

#define MAX 91

int main() {

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

	long long int dp_one[MAX] = { 0 };	//1๋กœ ๋๋‚˜๋Š” ์ด์ฐฌ์ˆ˜
	long long int dp_zero[MAX] = { 0 };	//0์œผ๋กœ ๋๋‚˜๋Š” ์ด์ฐฌ์ˆ˜
	dp_one[1] = 1;	//1
	dp_one[2] = 0;
	dp_zero[1] = 0;
	dp_zero[2] = 1;	//10
	for (int i = 3;i <= N;i++) {
		dp_one[i] = dp_zero[i - 1];
		dp_zero[i] = dp_one[i - 1] + dp_zero[i - 1];
	}

	printf("%lld\n", dp_one[N] + dp_zero[N]);
	return 0;
}


์ฝ”๋“œ ๋ณด๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>

#define MAX 91

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

    int dp[MAX] = { 0 };
    dp[1] = 1;
    dp[2] = 2;

    for (int i = 3; i <= n; i++) {
        //dp[i-1] : 0์œผ๋กœ ๋๋‚˜๋Š” ์ด์ฐฌ์ˆ˜, 1์ž๋ฆฌ๋งŒ ๋น„์–ด์žˆ์œผ๋ฉด ๋จ
        //dp[i-2] : 1๋กœ ๋๋‚˜๋Š” ์ด์ฐฌ์ˆ˜, 2์ž๋ฆฌ๊ฐ€ ๋น„์–ด์žˆ์–ด์•ผ ํ•จ
        dp[i] = dp[i - 1] + dp[i - 2];
    }

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

    return 0;
}



๐Ÿ“Œ 12. ์—ฐ์†ํ•ฉ : ๋‚˜์—ด๋œ ์ˆ˜ ์ค‘ ์—ฐ์†๋œ ๋ถ€๋ถ„ ์ตœ๋Œ€ํ•ฉ ๊ตฌํ•˜๊ธฐ : ์•„์ด๋””์–ด ํ•„์š”

๋ฐฑ์ค€ 1912๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include <stdio.h>

#define MAX 100001

int max_subarray_sum(int arr[], int n) {
	int max_sum = arr[0];
	int current_sum = arr[0];

	for (int i = 1; i < n; i++) {
        // ํ˜„์žฌ ์ˆ˜๊ฐ€ ์–‘์ˆ˜๋ฉด ๋”ํ•˜๊ณ , ์Œ์ˆ˜๋Š” ํ•ด๋‹น ์ˆ˜๋กœ
		current_sum = (current_sum > 0) ? (current_sum + arr[i]) : arr[i];
		//printf("%d\n", current_sum);
		if (current_sum > max_sum) {
			max_sum = current_sum;
		}
	}

	return max_sum;
}

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

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

	printf("%d\n", max_subarray_sum(arr, n));

	return 0;
}



๐Ÿ“Œ 13. ์–ด์งธ์„œโ€ฆ?

๋ฐฑ์ค€ 11055๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include <stdio.h>

int max_increasing_subsequence_sum(int arr[], int n) {
	int dp[n]; // dp[i]๋Š” i๋ฒˆ์งธ ์š”์†Œ๊นŒ์ง€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ์ตœ๋Œ€ ํ•ฉ
	dp[0] = arr[0];

	for (int i = 1; i < n; i++) {
		dp[i] = arr[i]; // ์ตœ์†Œ๊ฐ’ ์ดˆ๊ธฐํ™”
		for (int j = 0; j < i; j++) {
			if (arr[i] > arr[j]) {
				dp[i] = (dp[i] > dp[j] + arr[i]) ? dp[i] : (dp[j] + arr[i]);
			}
		}
	}

	int max_sum = dp[0];
	for (int i = 1; i < n; i++) {
		if (dp[i] > max_sum) {
			max_sum = dp[i];
		}
	}

	return max_sum;
}

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

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

	printf("%d\n", max_increasing_subsequence_sum(arr, n));

	return 0;
}



๐Ÿ“Œ 14. ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

๋ฐฑ์ค€ 11053

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>

#define N_MAX 1001
#define Max(a,b) ((a>b)?a:b)

int main() {
	int N;
	scanf("%d", &N);

	int A[N_MAX];
	for (int i = 1;i <= N;i++) scanf("%d", &A[i]);
	
	int dp[N_MAX] = { 0 };  //์ฒ˜์Œ๋ถ€ํ„ฐ i๋ฒˆ์งธ๊นŒ์ง€ ๊ฐ€์žฅ ๊ธด ๊ธธ์ด๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด
	dp[1] = 1; //A[1];	//์ดˆ๊ธฐ๊ฐ’

	for (int i = 2;i <= N;i++) {
		dp[i] = 1; //A[i];	//๊ธฐ๋ณธ๊ฐ’ A[i]๊ฐ€ ์ œ์ผ ํด ๋•Œ : ๊ธธ์ด 1
		for (int j = 1;j < i;j++) {
			if (A[i] > A[j]) {
				//ํ˜„์žฌ๊นŒ์ง€ ์•Œ๊ณ  ์žˆ๋˜ ์ตœ๋Œ€ ๊ธธ์ด์™€ ์ƒˆ๋กœ ์ˆ˜์ •๋œ + A[i]์„ ํฌํ•จ์‹œํ‚จ ๊ฒƒ(1) ์ค‘ ๋” ๊ธด ๊ธธ์ด๋ฅผ ์ €์žฅ
				dp[i] = Max(dp[i], dp[j] + 1);
				
				//dp[i] = Max(dp[i], dp[j] + A[i]);
				//printf("dp[%d] : %d\n",i, dp[i]);
			}
		}
	}

	//๊ฐ€์žฅ ๊ธด ๊ธธ์ด ์ฐพ๊ธฐ
	int max_len = 0;
	for (int i = 1;i <= N;i++) {
		if (dp[i] > max_len) max_len = dp[i];
	}

	printf("%d\n", max_len);
	return 0;
}



๐Ÿ“Œ 15. ํŒŒ๋„๋ฐ˜ ์ˆ˜์—ด

๋ฐฑ์ค€ 9461๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>

#define MAX 101

int main() {
	int T;
	scanf("%d", &T);

	for (int i = 0;i < T;i++) {
		int N;
		scanf("%d", &N);

		long long int P[MAX];
		P[1] = 1;
		P[2] = 1;
		P[3] = 1;
		P[4] = 2;
		P[5] = 2;
		for (int j = 6, k = j - 5;j <= N;j++, k++) {
			P[j] = P[j - 1] + P[k];
		}

		printf("%lld\n", P[N]);
	}
	return 0;
}



๐Ÿ“Œ 16. ์Šคํ‹ฐ์ปค

๋ฐฑ์ค€ 9465๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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<stdio.h>

#define N_MAX 100000

#define Max(a,b) ((a>b)?a:b)

int sol(int score[2][N_MAX], int n) {

	int dp[2][N_MAX];	//๊ฐ ํ–‰์— ๋Œ€ํ•œ j๊นŒ์ง€ ์ตœ๋Œ€ ๊ฐ’ 
	dp[0][0] = score[0][0];
	dp[1][0] = score[1][0];

	for (int j = 1;j < n;j++) {
		//score[i][j]๋ฅผ ๋„ฃ์–ด์„œ ์ตœ๋Œ€๊ฐ’์„ ๋งŒ๋“ค ๋•Œ, dp[][j-1] ๋˜๋Š” dp[][j-2]์— ์ถ”๊ฐ€ํ•˜๋Š” ๋‘ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ
		dp[0][j] = score[0][j] + Max(dp[1][j - 1], dp[1][j - 2]);
		dp[1][j] = score[1][j] + Max(dp[0][j - 1], dp[0][j - 2]);
	}

	int max_sum = 0;
	for (int i = 0;i < 2;i++) {
		for (int j = 0;j < n;j++) {
			if (dp[i][j] > max_sum) max_sum = dp[i][j];
		}
	}
	return max_sum;
}
int main() {

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

	for (int i = 0;i < T;i++) {
		int n;
		scanf("%d", &n);

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

		int ans = sol(score, n);
		printf("%d\n", ans);
	}
	return 0;
}



๐Ÿ“Œ 17. ํ‡ด์‚ฌ : DP ์—ญ๋ฐฉํ–ฅ

๋ฐฑ์ค€ 14501๋ฒˆ

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
26
27
28
29
30
31
32
#include<stdio.h>
#include<string.h>

#define MAX (15+2)	//dp[16]์„ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ
#define Max(a,b) ((a>b)?a:b)

int main() {
	int N;
	scanf("%d", &N);

	int T[MAX] = { 0 };
	int P[MAX] = { 0 };
	for (int i = 1;i <= N;i++) {
		scanf("%d %d", &T[i], &P[i]);
	}

	int dp[MAX] = { 0 };

	for (int i = N;i >= 1;i--) {
		if (i + T[i] > N+1) {	//์ผํ•˜๋ฉด ํ‡ด์‚ฌ์ผ ์ดˆ๊ณผ
			dp[i] = dp[i + 1];	//์œ ์ง€
		}
		else {	//์ผ ํ•˜๊ธฐ
			//์œ ์ง€์™€ ์ผ ํ–ˆ์„ ๋•Œ ์ค‘ ํฐ๊ฐ’ ๋„ฃ๊ธฐ
			dp[i] = Max(dp[i + 1], P[i] + dp[i + T[i]]);
		}
	}

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

	return 0;
}


์ตœ๋Œ€๊ฐ€ 15์ด๋ฏ€๋กœ DFS๋„ ๊ฐ€๋Šฅ

DFS ์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>

#define MAX (15+1)

int N;
int T[MAX];
int P[MAX];
int max_profit = 0;

void dfs(int day, int profit) {

	if (day > N) {
		if (profit > max_profit) {
			max_profit = profit;
		}
		return;
	}

	if (day + T[day] - 1 <= N) {//์ƒ๋‹ด ๊ฐ€๋Šฅ
		dfs(day + T[day], profit + P[day]);
	}
	dfs(day + 1, profit);	//์ƒ๋‹ด ์•ˆํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ
}
int main() {

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

	dfs(1, 0);
	printf("%d\n", max_profit);

	return 0;
}



๐Ÿ“Œ 18. ๊ณ„๋‹จ์ˆ˜ ๊ตฌํ•˜๊ธฐ

๋ฐฑ์ค€ 10844๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>
#include<string.h>

#define MOD(a) (a % 1000000000)
#define MAX (100+1)

int main() {
	int N;
	scanf("%d", &N);

	int dp[10][MAX];	//์ฒซ์ˆ˜๊ฐ€ i์ด๊ณ  ๊ธธ์ด๊ฐ€ j์ธ dp
	memset(dp, 0, sizeof(dp));
	for (int i = 0;i <= 9;i++) dp[i][1] = 1;


	for (int j = 2;j <= N;j++) {
		for (int i = 0;i <= 9;i++) {	//์ฒซ์ˆ˜๊ฐ€ 0์ด ๋˜์ง€ ์•Š๋”๋ผ๋„ ๊ณ„์‚ฐ์—์„œ ํ•„์š”ํ•˜๋ฏ€๋กœ
			dp[i][j] = 0;
			if (i> 0) {
				dp[i][j] += dp[i - 1][j - 1];
				dp[i][j] = MOD(dp[i][j]);
			}
			if (i < 9) {
				dp[i][j] += dp[i + 1][j - 1];
				dp[i][j] = MOD(dp[i][j]);
			}
			//printf("%d\n", dp[i][j]);
		}
	}

	int res = 0;
	for (int i = 1;i <= 9;i++) {
		res += dp[i][N];
		res = MOD(res);
	}
	printf("%d\n", res);

	return 0;
}



๐Ÿ“Œ 19. ํฌ๋„์ฃผ : ์—ฐ์† 3์ž”์ด ์•„๋‹Œ ์ตœ๋Œ€ 3์ž” ๊ตฌํ•˜๊ธฐ

๋ฐฑ์ค€ 2156๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>

#define MAX (10000+1)

int max(int a, int b) {
	return (a > b) ? a : b;
}
int main() {
	int n;
	scanf("%d", &n);

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

	int dp[MAX];

	dp[1] = wine[1];
	dp[2] = wine[1] + wine[2];
	dp[3] = max(max(wine[1] + wine[2], wine[1] + wine[3]), wine[2] + wine[3]);
	for (int i = 4;i <= n;i++) {
		dp[i] = max(max(dp[i - 1], dp[i - 2] + wine[i]), wine[i] + wine[i - 1] + dp[i - 3]);
	}
	
	printf("%d\n", dp[n]);
	return 0;
}


๐Ÿ“Œ 20. 1,2,3 ๋”ํ•˜๊ธฐ

๋ฐฑ์ค€ 15988๋ฒˆ

dp[i]๋ฅผ ๊ตฌํ•  ๋•Œ, ๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€ 1,2,3์ด๋ƒ์— ๋”ฐ๋ผ dp[i-1], dp[i-2], dp[i-3]๊ณผ ๊ด€๋ จ
์ ํ™”์‹ : dp[i] = dp[i-1] + dp[i-2] + dp[i-3] dp,intํ˜• ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐฉ์ง€

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>

#define MOD(a) ((a)%1000000009)
#define MAX 1000000

int main() {
	int T;
	scanf("%d", &T);

	int dp[MAX + 1] = { 0 };
	dp[1] = 1;	// 1 = 1
	dp[2] = 2;	// 2 = 2 = 1+1
	dp[3] = 4;	// 3 = 3 = 2+1 = 2+1 = 1+1+1

	for (int i = 4;i <= MAX;i++) {
		dp[i] = MOD(MOD(dp[i - 1] + dp[i - 2]) + dp[i - 3]);
		//๋‘ ์ˆ˜ ์—ฐ์‚ฐ๋งˆ๋‹ค MOD์—ฐ์‚ฐ์„ ํ†ตํ•ด intํ˜• ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐฉ์ง€
	}

	while (T--) {
		int n;
		scanf("%d", &n);
		printf("%d\n", dp[n]);
	}

	return 0;
}
/*
์ ํ™”์‹ ๊ตฌํ•˜๊ธฐ
๋งˆ์ง€๋ง‰ ์ˆซ์ž๋กœ 1,2,3์„ ๋„ฃ๋ƒ์— ๋”ฐ๋ผ
1: 1
2: 2
3: 4
---
4: 7
5: 13
6: 24

dp[i] = dp[i-1] + dp[i-2] + dp[i-3] (i>=4)

*/


๐Ÿ“Œ 21. ์ž๋‘๋‚˜๋ฌด

๋ฐฑ์ค€ 2240๋ฒˆ

์ฒซ ์ฝ”๋“œ ๋ณด๊ธฐ
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<stdio.h>

#define MAX(a,b) ((a>b)?a:b)
#define TMAX 1000
#define WMAX 30

int main() {
    int T, W;
    scanf("%d %d", &T, &W);
    int drop[TMAX + 1] = { 0 };
    for (int i = 1; i <= T; i++) {
        scanf("%d", &drop[i]);
    }

    //dp[t][w][p] : t(์ดˆ) w(๋‚จ์€ ์ด๋™ ํšŸ์ˆ˜) p(์œ„์น˜) 
    int dp[TMAX + 1][WMAX + 1][2 + 1] = { 0 };

    // ์ดˆ๊ธฐ๊ฐ’
    dp[1][W][1] = (drop[1] == 1) ? 1 : 0;
    dp[1][W - 1][2] = (drop[1] == 2) ? 1 : 0;

    for (int i = 2; i <= T; i++) {
        for (int j = 0; j <= W; j++) {
            for (int k = 1; k <= 2; k++) {
                //1. ์ด๋ฒˆ ์ดˆ k ์œ„์น˜์—์„œ ์–ป๋Š” ์‚ฌ๊ณผ
                int get = (drop[i] == k) ? 1 : 0;

                //2. ์ด๋™ ์•ˆํ•œ๊ฑฐ
                dp[i][j][k] = dp[i - 1][j][k] + get;

                //2. ์ด๋™ ํ•œ๊ฑฐ
                if (j < W) {
                    dp[i][j][k] = MAX(dp[i][j][k], dp[i - 1][j + 1][3 - k] + get);
                }

            }
        }
    }

    //3. T์ดˆ์—์„œ์˜ ์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ
    int ans = 0;
    for (int w = 0; w <= W; w++) {
        for (int p = 1; p <= 2; p++) {
            ans = MAX(ans, dp[T][w][p]);
        }
    }

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


    return 0;
}
/*
๋งค์ดˆ๋งˆ๋‹ค ๋‘๊ฐœ์˜ ๋‚˜๋ฌด์ค‘ ํ•˜๋‚˜์—์„œ ์—ด๋งค ๋–จ์–ด์ง
์›€์ง์ด๋Š” ์‹œ๊ฐ„ 0์ดˆ
์ž๋‘๋Š” T์ดˆ๋™์•ˆ ๋–จ์–ด์ง, ์ตœ๋Œ€ W๋ฒˆ ์›€์ง์ด๊ณ  ์‹ถ
---
#1)
7 2
2 1 1 2 2 1 1

*/


๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ์ฝ”๋“œ ๋ณด๊ธฐ
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
48
49
50
51
#include<stdio.h>

#define MAX(a,b) ((a>b)?a:b)
#define TMAX 1000
#define WMAX 30

int main() {
    int T, W;
    scanf("%d %d", &T, &W);
    int drop[TMAX + 1] = { 0 };
    for (int i = 1; i <= T; i++) {
        scanf("%d", &drop[i]);
    }

    //dp[w][p] : t(์ดˆ) w(๋‚จ์€ ์ด๋™ ํšŸ์ˆ˜) p(์œ„์น˜) 
    int dp[TMAX + 1][WMAX + 1][2 + 1] = { 0 };

    // ์ดˆ๊ธฐ๊ฐ’
    dp[1][W][1] = (drop[1] == 1) ? 1 : 0;
    dp[1][W - 1][2] = (drop[1] == 2) ? 1 : 0;

    for (int i = 2; i <= T; i++) {
        for (int j = 0; j <= W; j++) {
            for (int k = 1; k <= 2; k++) {
                //1. ์ด๋ฒˆ ์ดˆ k ์œ„์น˜์—์„œ ์–ป๋Š” ์‚ฌ๊ณผ
                int get = (drop[i] == k) ? 1 : 0;

                //2. ์ด๋™ ์•ˆํ•œ๊ฑฐ
                dp[i][j][k] = dp[i - 1][j][k] + get;

                //2. ์ด๋™ ํ•œ๊ฑฐ
                if (j < W) {
                    dp[i][j][k] = MAX(dp[i][j][k], dp[i - 1][j + 1][3 - k] + get);
                }

            }
        }
    }

    //3. T์ดˆ์—์„œ์˜ ์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ
    int ans = 0;
    for (int w = 0; w <= W; w++) {
        for (int p = 1; p <= 2; p++) {
            ans = MAX(ans, dp[T][w][p]);
        }
    }

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

    return 0;
}


์ž๋‘ ๋–จ์–ด์ง€๋Š” ์œ„์น˜ 1,2๋ฅผ 0,1๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋” ์ตœ์ ํ™” ๊ฐ€๋Šฅ

๐Ÿ“Œ 22. ๊ทน์žฅ ์ขŒ์„

๋ฐฑ์ค€ 2302๋ฒˆ

๋‚ด ์ฝ”๋“œ ๋ณด๊ธฐ
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<stdio.h>

#define NMAX 40

int main() {
	int N, M;
	scanf("%d%d", &N, &M);

	int max_term = 0;
	int prev_fixed = 0;
	int termArr[NMAX + 1];	// fixed๋กœ ๊ตฌ๋ถ„ํ•œ ๊ฐ term์˜ ์š”์†Œ ๊ฐœ์ˆ˜

	int i = 1;
	for (i = 1;i <= M;i++) {
		int cur_fixed = 0;
		scanf("%d", &cur_fixed);

		termArr[i] = cur_fixed - prev_fixed - 1;
		if (termArr[i] > max_term) {
			max_term = termArr[i];
		}
		prev_fixed = cur_fixed;
	}
	// ๋งˆ์ง€๋ง‰ term
	termArr[i] = N - prev_fixed;
	if (termArr[i] > max_term) max_term = termArr[i];

	int dp[NMAX + 1] = { 0 };
	dp[1] = 1;
	dp[2] = 2;
	for (int i = 3;i <= max_term;i++) {
		dp[i] = dp[i - 1] + dp[i - 2];
		//printf("dp[%d] : %d\n", i, dp[i]);
	}

	int mult = 1;
	for (int i = 1;i <= M + 1;i++) {
		if (termArr[i] == 0) continue;	// fixed๊ฐ€ 1์ด์–ด์„œ ์•ž๊ตฌ๊ฐ„ ์š”์†Œ ๊ฐœ์ˆ˜๊ฐ€ 0์ธ ๊ฒฝ์šฐ ํŒจ์Šค
		mult *= dp[termArr[i]];
		//printf("mult: %d | termArr[%d] : %d\n", mult, i, termArr[i]);
	}

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

	return 0;
}
/*
ํ•ด๋‹น ์ขŒ์„์˜ ์ขŒ,์šฐ๋กœ ์ž๋ฆฌ ์˜ฎ๊ธฐ๊ธฐ ๊ฐ€๋Šฅ
vip๋Š” ์ž๊ธฐ ์ž๋ฆฌ์—๋งŒ ์•‰์„ ์ˆ˜ ์žˆ๋‹ค

#1)
123 56 89

3 * 2 * 2 = 12

1234 : 4

1234 
2134 
1324
1243
2143

*/


GPT ์ฝ”๋“œ ๋ณด๊ธฐ
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
#include <stdio.h>

int dp[41] = {1, 1, 2}; // ํ”ผ๋ณด๋‚˜์น˜ ๋ฐฐ์—ด (์ดˆ๊ธฐ ๊ฐ’ ์„ค์ •)

int main() {
    int N, M, vip, prev = 0, result = 1;
    
    scanf("%d %d", &N, &M);
    
    // ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ (์ขŒ์„ ๊ฐœ์ˆ˜ ์ตœ๋Œ€ 40์ด๋ฏ€๋กœ ๊ฐ€๋Šฅ)
    for (int i = 3; i <= N; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }

    for (int i = 0; i < M; i++) {
        scanf("%d", &vip);
        result *= dp[vip - prev - 1]; // ์ผ๋ฐ˜ ์ขŒ์„ ๊ทธ๋ฃน์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ณฑํ•˜๊ธฐ
        prev = vip;
    }
    
    result *= dp[N - prev]; // ๋งˆ์ง€๋ง‰ ๊ทธ๋ฃน ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ฐ˜์˜

    printf("%d\n", result);
    
    return 0;
}


GPT์ฝ”๋“œ๊ฐ€ ์ข€ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…๋ฃŒํ•จ

๐Ÿ“Œ 23. ์˜ค๋ฅด๋ง‰ ์ˆ˜

๋ฐฑ์ค€ 11057๋ฒˆ

#define MOD(a) ((a)%10007) (a)์— ๊ด„ํ˜ธ ๊ผญ ์น˜๊ธฐ!!! ๊ฒฐ๊ณผ ๋‹ฌ๋ผ์ง

์ฝ”๋“œ ๋ณด๊ธฐ
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
#include<stdio.h>

#define MAX_N 1000
#define MOD(a) ((a)%10007)	//(a)์— ๊ด„ํ˜ธ ๊ผญ ์น˜๊ธฐ!!! ๊ฒฐ๊ณผ ๋‹ฌ๋ผ์ง

int main() {
	int N;
	scanf("%d", &N);

	int dp[MAX_N + 1][10] = { 0 };	//[i][j] //i : ์ž๋ฆฌ์ˆ˜, j : ์ถ”๊ฐ€ํ•  ์ˆ˜
	for (int i = 0;i <= 9;i++) dp[1][i] = 1;	//์ดˆ๊ธฐ๊ฐ’

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

			for (int k = 0;k <= 9;k++) {
				if (k <= j) {	//i๋ฒˆ์งธ ์ž๋ฆฌ์— j๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด i-1๋ฒˆ์งธ ์ž๋ฆฌ(k)๊ฐ€ j๋ณด๋‹ค ์ž‘์„๋•Œ๋งŒ ๊ฐ€๋Šฅ
					dp[i][j] = MOD(dp[i][j] + dp[i - 1][k]);
				}
			}
		}
	}

	int res = 0;
	for (int i = 0;i <= 9;i++) {
		res = MOD(res + dp[N][i]);
	}
	printf("%d\n", res);

	return 0;
}
/*
์˜ค๋ฅด๋ง‰์ˆ˜
์˜ค๋ฆ„์ฐจ์ˆœ์„ ์ด๋ฃจ๋Š” ์ˆ˜(์ธ์ ‘ํ•œ ์ˆ˜ ๊ฐ™์•„๋„ ๋จ)
ex) 2234 3678 11119
์ž๋ฆฌ์ˆ˜ N

์˜ค๋ฅด๋ง‰ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ
---

*/


๐Ÿ“Œ 24. ์‚ผ๊ฐ ๊ทธ๋ž˜ํ”„

๋ฐฑ์ค€ 4883๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<stdio.h>

#define MIN(a,b) ((a)<(b)?(a):(b))

int main() {

	int T = 0;
	while (1) {
		T++;

		int N;
		scanf("%d", &N);
		if (N == 0) break;

		int min_cost = 0;
		int cost[3] = { 0, 0, 0 };
		int prev_cost[3] = { 0,0,0 };
		int first_input[3];	//์ฒซ ์ž…๋ ฅ๋งŒ ์ €์žฅ : ์ฒซ ์ถœ๋ฐœ์ด ๊ฐ€์šด๋ฐ ๊ณ ์ •์ด๋ฏ€๋กœ ์ฒซํ–‰ ๋น„์šฉ์€ ๋”ฐ๋กœ ๊ณ„์‚ฐ

		//์ฒซํ–‰
		scanf("%d %d %d\n", &first_input[0], &first_input[1], &first_input[2]);
		cost[0] = first_input[1];
		cost[1] = first_input[1];
		cost[2] = first_input[1] + first_input[2];

		//๋‚˜๋จธ์ง€ํ–‰
		for (int i = 0;i < (N - 1) * 3;i++) {
			int input = 0;
			scanf("%d", &input);

			if ((i + 1) % 3 == 1) {			//3 6 ...
				prev_cost[0] = cost[0];

				cost[0] = MIN(cost[0], cost[1]);
				cost[0] += input;
			}
			else if ((i + 1) % 3 == 2) {	//4 7 ...
				prev_cost[1] = cost[1];

				cost[1] = MIN(MIN(MIN(cost[0], cost[1]), prev_cost[0]), cost[2]);
				cost[1] += input;
			}
			else if ((i + 1) % 3 == 0) {	//5 8 ...
				prev_cost[2] = cost[2];

				cost[2] = MIN(MIN(cost[1], prev_cost[1]), cost[2]);
				cost[2] += input;
			}
			//printf("====%d %d %d\n", cost[0], cost[1], cost[2]);
		}

		printf("%d. %d\n", T, cost[1]);
	}

	return 0;
}
/*
๋ฌธ์ œ๋ฅผ ์ž˜ ์‚ดํŽด๋ณด๋ฉด,
ํ•ด๋‹น ํ–‰ ๊ณ„์‚ฐ์— ํ•„์š”ํ•œ ๊ฐ’์€ ํ˜„์žฌ ํ–‰๊ณผ ์ด์ „ํ–‰ ์ด 6๊ฐœ์˜ intํ˜•๋งŒ ํ•„์š”

*/


๐Ÿ“Œ 25. ๋™์ „1

๋ฐฑ์ค€ 2293๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<stdio.h>

#define MAX_N 100
#define MAX_K 10000

int main() {
    int n, k;
    scanf("%d %d", &n, &k);

    int dp[MAX_K + 1] = { 0 };
    int coin[MAX_N] = { 0 };
    for (int i = 0;i < n;i++) {
        scanf("%d", &coin[i]);
        //dp[coin[i]] = 1;
    }
 
    dp[0] = 1;  // 0์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• : ์•„๋ฌด ๋™์ „๋„ ์‚ฌ์šฉ ์•ˆํ•จ
    
    // ๋ฐ˜๋ณต๋ฌธ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”
    // i๊ธˆ์•ก์ด ๋˜๊ฒŒ๋” j ๋™์ „์„ ๋จผ์ € ๋ฐฐ์น˜
    // ๊ฒฐ๊ณผ์— ๋™์ „์˜ ์ˆœ์„œ ๊ณ ๋ ค x : ๋™์ „ ๋จผ์ €, ๊ธˆ์•ก ๋‚˜์ค‘
    for (int j = 0;j < n;j++) { // ์ถ”๊ฐ€ํ•  coin ๋ฐ˜๋ณต
        for (int i = 1;i <= k;i++) {    //๊ธˆ์•ก ๋ฐ˜๋ณต
            if (i >= coin[j]) {
                dp[i] += dp[i - coin[j]];
                //printf("%d %d | %d\n", i, j, dp[i]);
            }
        }
    }
    /*
    // i๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‹ค์Œ ์ž๋ฆฌ์— 1,2,5์ค‘ํ•˜๋‚˜์ธ j๋ฅผ ์ถ”๊ฐ€
    // ๊ฒฐ๊ณผ์— ๋™์ „์˜ ์ˆœ์„œ๊ฐ€ ๊ณ ๋ ค๋จ : ๊ธˆ์•ก ๋จผ์ €, ๋™์ „ ๋‚˜์ค‘
    for (int i = 1;i <= k;i++) {    //๊ธˆ์•ก ๋ฐ˜๋ณต
        for (int j = 0;j < n;j++) { //์ถ”๊ฐ€ํ•  coin ๋ฐ˜๋ณต
            if (i >= coin[j]) {
                dp[i] += dp[i - coin[j]];
                //printf("%d %d | %d\n", i, j, dp[i]);
            }
        }
    }
    */
    printf("%d\n", dp[k]);
    return 0;
}
/*
๋™์ „์„ ์ ๋‹นํžˆ ์‚ฌ์šฉํ•ด์„œ ๊ฐ€์น˜ํ•ฉ์ด k์›์ด ๋˜๋„๋กํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
๊ทœ์น™์„ฑ
10 =
1+1+1+1+1+1+1+1+1+1
1+1+1+1+1+1+1+1+2
1+1+1+1+1+1+2+2
1+1+1+1+2+2+2
1+1+1+1+1+5
1+1+2+2+2+2
2+1+1+1+5
2+2+2+2+2
2+2+1+5
5+5

*/


๐Ÿ“Œ 26. ๋‚ด๋ ค๊ฐ€๊ธฐ

๋ฐฑ์ค€ 2096๋ฒˆ

์ฝ”๋“œ ๋ณด๊ธฐ
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include<stdio.h>

#define INF (~(1<<31))
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))

int main() {
	int N;
	scanf("%d", &N);

	int input[3] = { 0 };

	// [i][j] : i : 0,1,2 ์ž…๋ ฅํ•˜๋Š” ์„ธ ์ˆ˜, j : 0์€ ์ด์ „ ๊ฐ’, 1์€ ํ˜„์žฌ ๊ฐ’
	int max_dp[3][2] = { 0 };
	int min_dp[3][2] = { 0 };

	for (int i = 0;i < N;i++) {
		scanf("%d %d %d", &input[0], &input[1], &input[2]);

		max_dp[0][1] = MAX(max_dp[0][0], max_dp[1][0]) + input[0];
		max_dp[1][1] = MAX(MAX(max_dp[0][0], max_dp[1][0]), max_dp[2][0]) + input[1];
		max_dp[2][1] = MAX(max_dp[1][0], max_dp[2][0]) + input[2];

		min_dp[0][1] = MIN(min_dp[0][0], min_dp[1][0]) + input[0];
		min_dp[1][1] = MIN(MIN(min_dp[0][0], min_dp[1][0]), min_dp[2][0]) + input[1];
		min_dp[2][1] = MIN(min_dp[1][0], min_dp[2][0]) + input[2];


		for (int i = 0;i < 3;i++) {
			max_dp[i][0] = max_dp[i][1];
			min_dp[i][0] = min_dp[i][1];
		}

		//printf(">>%d %d %d\n", max_dp[0][1], max_dp[1][1], max_dp[2][1]);
	
	}

	int max = 0;
	int min = INF;
	for (int i = 0;i < 3;i++) {
		if (max_dp[i][1] > max) max = max_dp[i][1];
		if (min_dp[i][1] < min) min = min_dp[i][1];
	}
	printf("%d %d\n", max, min);

	return 0;
}
/*
์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ ์ˆ˜์™€ ์ตœ์†Œ ์ ์ˆ˜ ๊ตฌํ•˜๋ผ

์ฒซ ์ค„์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋งˆ์ง€๋ง‰ ์ค„์—์„œ ๋

#1)
3
1 2 3
4 5 6
4 9 0

ans: 18 6
max 3 6 9 : 18
min 1 5 0 : 6

*/


๐Ÿ“Œ 27. ํŒŒ์ดํ”„ ์˜ฎ๊ธฐ๊ธฐ1

๋ฐฑ์ค€ 17070๋ฒˆ

์ฒซ ์ฝ”๋“œ(dfs) ๋ณด๊ธฐ
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include<stdio.h>
#include<stdbool.h>

#define MAX_MAP 16

enum Map {
	EMPTY = 0,
	WALL = 1,
};

typedef struct {
	int x;
	int y;
}Pos;

typedef struct {
	Pos head;
	Pos tail;
}Pipe;

int N;
int map[MAX_MAP][MAX_MAP];

bool visited[MAX_MAP][MAX_MAP];

int cnt = 0;
int movePipe(Pipe cur, Pipe newArr[3]) {
	int ret = 0;
	
	Pos newHead = { 0 };
	Pos newTail = (Pos){ cur.head.x, cur.head.y };

	// ๊ฐ€๋กœ
	if (cur.head.x == cur.tail.x) {
		newHead = (Pos){ cur.head.x, cur.head.y + 1 };
		newArr[0] = (Pipe){ newHead, newTail };

		newHead = (Pos){ cur.head.x + 1, cur.head.y + 1 };
		newArr[1] = (Pipe){ newHead,newTail };
		ret = 2;
	}
	// ์„ธ๋กœ
	else if (cur.head.y == cur.tail.y) {
		newHead = (Pos){ cur.head.x + 1, cur.head.y };
		newArr[0] = (Pipe){ newHead, newTail };

		newHead = (Pos){ cur.head.x + 1, cur.head.y + 1 };
		newArr[1] = (Pipe){ newHead,newTail };
		ret = 2;
	}
	// ๋Œ€๊ฐ์„  ์•„๋ž˜
	else if ((cur.head.x == cur.tail.x + 1) && (cur.head.y == cur.tail.y + 1)) {
		newHead = (Pos){ cur.head.x, cur.head.y + 1 };	// ๊ฐ€๋กœ
		newArr[0] = (Pipe){ newHead, newTail };

		// ๋Œ€๊ฐ
		newHead = (Pos){ cur.head.x + 1, cur.head.y + 1 };
		newArr[1] = (Pipe){ newHead,newTail };

		newHead = (Pos){ cur.head.x + 1, cur.head.y };	// ์„ธ๋กœ
		newArr[2] = (Pipe){ newHead, newTail };

		ret = 3;
	}

	return ret;
}
void dfs(Pipe cur, Pos end) {
	
	bool endFlagHead = (cur.head.x == end.x) && (cur.head.y == end.y);
	bool endFlagTail = (cur.tail.x == end.x) && (cur.tail.y == end.y);

	if (endFlagHead || endFlagTail) {
		cnt++;
		return;
	}

	Pipe newArr[3] = { 0,0,0,0 };
	int numOfMove = movePipe(cur, newArr);	// ํ˜„์žฌ ํŒŒ์ดํ”„ ๊ฐ€๋กœ, ์„ธ๋กœ๋ฉด ์ด๋™ ๋ฐฉ๋ฒ• : 2, ๋Œ€๊ฐ์„ ์ด๋ฉด ์ด๋™ ๋ฐฉ๋ฒ• : 3
	
	for (int i = 0;i < numOfMove;i++) {
		Pos newHead = newArr[i].head;
		//printf("%d %d %d %d\n", newHead.x >= 0, newHead.x < N, newHead.y >= 0, newHead.y);

		if (newHead.x >= 0 && newHead.x < N && newHead.y >= 0 && newHead.y < N) {
			//printf("%d %d | %d\n", newArr[i].head.x, newArr[i].head.y, N);

			if (map[newHead.x][newHead.y] == WALL) continue;

			if (i == 1) {	// ๋Œ€๊ฐ์„ ์€ ์ถ”๊ฐ€๋กœ ํ™•์ธ
				if (newHead.x >= 1 && map[newHead.x - 1][newHead.y] == WALL) continue;
				if (newHead.y >= 1 && map[newHead.x][newHead.y - 1] == WALL) continue;
			}
			dfs(newArr[i], end);
		}
	}
}
int main() {

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

	Pipe start = { (Pos) { 0,1 }, (Pos) { 0,0 } };
	Pos end = { N - 1, N - 1 };

	dfs(start, end);

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

	return 0;
}
/*
ํŒŒ์ดํ”„๋Š” ํ•ญ์ƒ ๋นˆ์นธ๋งŒ ์ฐจ์ง€
์˜ค๋ฅธ์ชฝ, ๋Œ€๊ฐ์„ ์•„๋ž˜, ์•„๋ž˜
ํšŒ์ „์€ 45๋„๋กœ


*/


๊ฐœ์„  ์ฝ”๋“œ(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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>

int n, map[17][17];
int dp[17][17][3];

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

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

    // ์ดˆ๊ธฐ ์ƒํƒœ (1,2)์— ๊ฐ€๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ํŒŒ์ดํ”„๊ฐ€ ์žˆ์Œ
    dp[1][2][0] = 1;

    // DP ์ˆ˜ํ–‰
    for (int i = 1; i <= n; i++) {
        for (int j = 2; j <= n; j++) {
            if (map[i][j] == 1) continue; // ๋ฒฝ์ด๋ฉด ์ด๋™ ๋ถˆ๊ฐ€

            // ๊ฐ€๋กœ โ†’ ๊ฐ€๋กœ (โ†’) ๊ฐ€ ๋˜๋Š” ๋ฐฉ๋ฒ•
            if (j > 1) dp[i][j][0] += dp[i][j - 1][0] + dp[i][j - 1][2];

            // ์„ธ๋กœ โ†“ ์„ธ๋กœ ๊ฐ€ ๋˜๋Š” ๋ฐฉ๋ฒ•
            if (i > 1) dp[i][j][1] += dp[i - 1][j][1] + dp[i - 1][j][2];

            // ๋Œ€๊ฐ์„  โ†˜ ๋Œ€๊ฐ์„  ์ด ๋˜๋Š” ๋ฐฉ๋ฒ•
            if (i > 1 && j > 1) {
                if (map[i - 1][j] == 0 && map[i][j - 1] == 0) {	// ๋Œ€๊ฐ์„ ์€ ๋‘์นธ์ด ์ถ”๊ฐ€๋กœ ๋น„์–ด์•ผํ•จ
                    dp[i][j][2] += dp[i - 1][j - 1][0] + dp[i - 1][j - 1][1] + dp[i - 1][j - 1][2];
                }
            }
        }
    }

    // ์ตœ์ข… ๊ฒฐ๊ณผ: (n, n)์— ๋„๋‹ฌํ•˜๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์˜ ํ•ฉ
    printf("%d\n", dp[n][n][0] + dp[n][n][1] + dp[n][n][2]);

    return 0;
}


ํŒŒ์ดํ”„์˜ ์ด๋™๋ฐฉํ–ฅ์ด ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ๋Œ€๊ฐ์„ ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๊ณ ์ •๋˜์–ด์žˆ๊ณ , ๋„์ฐฉํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ
-> DP๊ฐ€ ํšจ์œจ์ , ์›€์ง์ธ ๊ฒฐ๊ณผ์˜ ๋ชจ์–‘[3]์„ ๊ธฐ์ค€์œผ๋กœ dp ์„ค๊ณ„


###