๐ DP
๐ 1. DP, DPS, BFS ์๊ฐ ๋น๊ต
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
์ฝ๋ ๋ณด๊ธฐ
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
์ฝ๋ ๋ณด๊ธฐ
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 ์์น ํ๊ธฐ)
์ฝ๋ ๋ณด๊ธฐ
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 ์ง์ฌ๊ฐํ ์ฑ์ฐ๊ธฐ
์ฝ๋ ๋ณด๊ธฐ
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. ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ
์ฝ๋ ๋ณด๊ธฐ
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 : ์ด๋์ ์๋์ง ๊ธฐ์ต
์ฝ๋ ๋ณด๊ธฐ
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์ ์ถ๋ ฅ ํ์
์ฝ๋ ๋ณด๊ธฐ
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. ์ผ๊ฐํ ๋ด๋ ค๊ฐ๋ฉฐ ๋ํ๊ธฐ
๋ณต์ก
์ฝ๋ ๋ณด๊ธฐ
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
์ฝ๋ ๋ณด๊ธฐ
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๋ก ๋๋๋ ์ ๋๋ ์ ์๊ฐ
์ฝ๋ ๋ณด๊ธฐ
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. ์ฐ์ํฉ : ๋์ด๋ ์ ์ค ์ฐ์๋ ๋ถ๋ถ ์ต๋ํฉ ๊ตฌํ๊ธฐ : ์์ด๋์ด ํ์
์ฝ๋ ๋ณด๊ธฐ
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. ์ด์งธ์โฆ?
์ฝ๋ ๋ณด๊ธฐ
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. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด
์ฝ๋ ๋ณด๊ธฐ
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. ํ๋๋ฐ ์์ด
์ฝ๋ ๋ณด๊ธฐ
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. ์คํฐ์ปค
์ฝ๋ ๋ณด๊ธฐ
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 ์ญ๋ฐฉํฅ
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. ๊ณ๋จ์ ๊ตฌํ๊ธฐ
์ฝ๋ ๋ณด๊ธฐ
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์ ๊ตฌํ๊ธฐ
์ฝ๋ ๋ณด๊ธฐ
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 ๋ํ๊ธฐ
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. ์๋๋๋ฌด
์ฒซ ์ฝ๋ ๋ณด๊ธฐ
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. ๊ทน์ฅ ์ข์
๋ด ์ฝ๋ ๋ณด๊ธฐ
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. ์ค๋ฅด๋ง ์
#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. ์ผ๊ฐ ๊ทธ๋ํ
์ฝ๋ ๋ณด๊ธฐ
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
์ฝ๋ ๋ณด๊ธฐ
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. ๋ด๋ ค๊ฐ๊ธฐ
์ฝ๋ ๋ณด๊ธฐ
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
์ฒซ ์ฝ๋(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 ์ค๊ณ
###