BOJ::1932 숫자삼각형

https://www.acmicpc.net/problem/1932


dp 문제이다.

d배열의 각 지점마다 올 수 있는 최대값을 저장해주면서 끝까지 가면 된다.


<JAVA>


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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
    
    static int n;
    static int d[][]=new int[501][501];
    static int map[][]=new int[501][501];
    
    public static void main(String args[]) throws NumberFormatException, IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n=Integer.parseInt(br.readLine());
        
        StringTokenizer st = null;
        
        for(int i = 1 ; i <= n ; i++){
            st = new StringTokenizer(br.readLine());
            int j =1;
            while(st.hasMoreTokens()){
                map[i][j]=Integer.parseInt(st.nextToken());
                j++;
            }
        }
        
        d[1][1]=map[1][1];
        for(int i = 2 ; i <= n ; i++){
            d[i][1]=map[i][1]+d[i-1][1];
            d[i][i]=map[i][i]+d[i-1][i-1];
            for(int j = 2 ; j < i ; j++){
                d[i][j]=map[i][j]+Math.max(d[i-1][j], d[i-1][j-1]);
            }
        }
        
        int max =0;
        for(int i = 1 ; i <= n ; i++){
            if(max <d[n][i]){
                max = d[n][i];
            }
        }
        System.out.println(max);
        
    }
}
 
cs



<C++>


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
#include <iostream>
using namespace std;
 
int n;
int d[501][501];
int map[501][501];
 
int max(int a, int b) {
    if (a > b) {
        return a;
    }
    return b;
}
 
int main() {
    
    cin >> n;
 
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            cin >> map[i][j];
        }
    }
 
    d[1][1= map[1][1];
 
    for (int i = 1; i <= n; i++) {
        d[i][1= map[i][1+ d[i - 1][1];
        d[i][i] = map[i][i] + d[i - 1][i - 1];
        for (int j = 2; j < i; j++) {
            d[i][j] = map[i][j] + max(d[i - 1][j - 1], d[i - 1][j]);
        }
    }
 
    int max = 0;
    for (int i = 1; i <= n; i++) {
        if (max < d[n][i]) {
            max = d[n][i];
        }
    }
    cout << max << endl;
 
}
cs


'BOJ::문제풀이' 카테고리의 다른 글

1965 상자넣기  (0) 2018.01.01
1934 최소공배수  (0) 2018.01.01
1929 소수 구하기  (0) 2018.01.01
1920 수 찾기  (0) 2018.01.01
1890 점프  (0) 2017.12.31

+ Recent posts