반응형
문제
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
위 그림은 크기가 5인 숫자 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 숫자는 모두 정수이며, 범위는 0 이상 9999 이하이다.
출처:https://www.acmicpc.net/problem/1932
문제 해결 방법:
- dp[i][j]에서 i는 세로 열 j는 가로 행을 뜻한다
- 위 문제에서 예를 들면 dp[0][0]은 가장 위에 7이다
- 3자리에는 7과 3을 더한 10을 저장하고 8자리에는 15를 저장한다
- 3번째 줄에 1의 경우에는 3과 8에 저장된 수중 큰 값을 가져와서 더한후 저장한다
- 8자리에 15가 더 크므로 1의 자리에는 16을 저장한다,
- 마지막 N-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 | #include<iostream> #include<queue> #include<functional> using namespace std; int Max(int a, int b) { return a > b ? a : b; } int main() { int dp[501][501]; int N; scanf_s("%d", &N); for (int i = 0; i < N; i++) { for (int j = 0; j < i + 1; j++) { scanf_s("%d", &dp[i][j]); } } for (int i = 1; i < N; i++) { for (int j = 0; j < i + 1; j++) { if (j < i&&j != 0) { dp[i][j] += Max(dp[i - 1][j], dp[i - 1][j - 1]); } else if (j == 0) { dp[i][j] += dp[i - 1][j]; } else if (j==i) { dp[i][j] += dp[i - 1][j - 1]; } } } priority_queue<int, vector<int>, less<int>> q; for (int i = 0; i < N; i++) { q.push(dp[N - 1][i]); } cout << q.top(); } | cs |
반응형
'알고리즘' 카테고리의 다른 글
<백준> 2193번 이친수 (0) | 2018.02.04 |
---|---|
<백준>2579번 계단오르기 (0) | 2018.02.01 |
<백준> 1012번 유기농 배추 (0) | 2018.01.23 |
<백준> 2583번 영역 구하기 (0) | 2018.01.18 |
<백준> 2217번 로프 (0) | 2018.01.13 |