๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ

[BOJ] #2169 ๋กœ๋ด‡ ์กฐ์ข…ํ•˜๊ธฐ

by dar0m! 2019. 10. 2.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ 512 MB 31.977%

 

 

2169๋ฒˆ: ๋กœ๋ด‡ ์กฐ์ข…ํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— N, M(1≤N, M≤1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” M๊ฐœ์˜ ์ˆ˜๋กœ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ ์ˆ˜๋Š” ์ ˆ๋Œ“๊ฐ’์ด 100์„ ๋„˜์ง€ ์•Š๋Š” ์ •์ˆ˜์ด๋‹ค. ์ด ๊ฐ’์€ ๊ทธ ์ง€์—ญ์˜ ๊ฐ€์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

www.acmicpc.net

 

๋ฐฉ๋ฒ•

๋กœ๋ด‡์ด '์•„๋ž˜์™€ ์˜ค๋ฅธ์ชฝ'์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ๊ณผ '์•„๋ž˜์™€ ์™ผ์ชฝ'์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ ๋‘ ๋ฐฉ๋ฒ•์„ ๊ฐ๊ฐ ๊ตฌํ•ด์„œ ๋” ํฐ ๊ฐ’์œผ๋กœ dp ๋ฐฐ์—ด์„ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค.

์—ญ์‹œ๋‚˜.. dp๋Š” ํ†ต์ฐฐ๋ ฅ!! ํ†ต์ฐฐ๋ ฅ์„ ํ‚ค์šฐ์žใ…œใ…œ

 

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
9012 KB 124 ms
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
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define INF -1000000
int arr[1005][1005];
int dp1[1005][1005];
int dp2[1005];
int n, m;
int main(void)
{
    scanf("%d %d"&n, &m);
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= m; j++) {
            dp1[i][j] = INF;
        }
    }
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%d"&arr[i][j]);
 
    dp1[1][0= 0;
    for (int j = 1; j <= m; j++)
        dp1[1][j] = dp1[1][j - 1+ arr[1][j];
 
    for (int i = 2; i <= n; i++) {
 
        for (int j = 0; j <= m+1; j++)
            dp2[j] = INF;
 
        for (int j = 1; j <= m; j++) {
            dp1[i][j] = max(dp1[i][j - 1], dp1[i - 1][j]) + arr[i][j];
        }
        for (int j = m; j >= 1; j--) {
            dp2[j] = max(dp2[j + 1], dp1[i - 1][j]) + arr[i][j];
        }
 
        for (int j = 1; j <= m; j++) {
            dp1[i][j] = max(dp1[i][j], dp2[j]);
        }
    }
 
    printf("%d\n", dp1[n][m]);
    return 0;
}
cs

 

1์ฐจ์› ๋ฐฐ์—ด 3๊ฐœ๋กœ ๋๋‚ด๋Š” ๋ฐฉ๋ฒ•!

๋งž์€ ์‚ฌ๋žŒ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋˜ ํ•œ ๋ฒˆ ๋ฐฐ์šฐ๊ฒŒ ๋œ๋‹ค.. ๋ฉ‹์ง„ ์‚ฌ๋žŒ๋“ค

์ด ๋ฐฉ๋ฒ•์€ ๊ฐ€์ค‘์น˜๋ฅผ ๋ฐ›์œผ๋ฉด์„œ ๋™์‹œ์— ์—ฐ์‚ฐ์„ ํ•˜๋Š”๋ฐ, ๋ฐฐ์—ด B ๊ฐ€ '์•„๋ž˜์™€ ์˜ค๋ฅธ์ชฝ'์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฐ€์ค‘์น˜์˜ ํ•ฉ, A๊ฐ€ '์•„๋ž˜์™€ ์™ผ์ชฝ'์œผ๋กœ ์ด๋™ํ• ๋•Œ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
1128 KB 116 ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int dp[1000], A[1000], B[1000];
int n, m;
int main(void){    
    scanf("%d%d"&n, &m);
    fill(dp + 1, dp + m, (int)-1e9);
    dp[0= 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d"&A[j]);
            B[j] = (j && B[j - 1> dp[j] ? B[j - 1] : dp[j]) + A[j];
        }
        for (int j = m - 1; j >= 0; j--)
            A[j] += j<- 1 && A[j + 1]>dp[j] ? A[j + 1] : dp[j];
        for (int j = 0; j < m; j++)
            dp[j] = max(A[j], B[j]);
    }
    printf("%d", dp[m - 1]);
    
    return 0;
}
cs

'๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] #13458 ์‹œํ—˜๊ฐ๋…  (0) 2019.10.09
[BOJ] #2240 ์ž๋‘๋‚˜๋ฌด  (0) 2019.10.02
[BOJ] #1149 RGB ๊ฑฐ๋ฆฌ  (0) 2019.10.02
[BOJ] #1010 ๋‹ค๋ฆฌ๋†“๊ธฐ  (0) 2019.10.02
[BOJ] #14891 ํ†ฑ๋‹ˆ๋ฐ”ํ€ด  (0) 2019.10.02

๋Œ“๊ธ€