Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 1차원 DP
- 2차원 dp
- 99클럽
- @GeneratedValue
- @GenericGenerator
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
- Collections
- Combination
- combinations
Archives
- Today
- Total
기록
백준_2169_로봇 조종하기 본문
문제
https://www.acmicpc.net/problem/2169
풀이
DP
위치를 위, 오른쪽, 왼쪽으로 움직이면서 가장 큰 경우를 board에 저장한다.
1. 0번째 행의 경우, 오른쪽으로만 이동이 가능하다.
2. 1번째 ~ N-1번째 행까지, 오른쪽/왼쪽으로 이동이 모두 가능하다.
2-1. 왼쪽과 위쪽을 비교하여 구한 배열과
2-2. 오른쪽과 위쪽을 비교하여 구한 배열을 비교해
해당 위치에서 가질 수 있는 최대값을 board에 저장한다.
코드
import sys
input = sys.stdin.readline
N, M = map(int, input().strip().split())
board = [list(map(int, input().strip().split())) for i in range(N)]
# 맨 윗줄
for j in range(1, M) :
board[0][j] += board[0][j-1]
# 나머지
for i in range(1, N) :
startLeft = [board[i][j]+board[i-1][j] for j in range(M)]
startRight = [board[i][j]+board[i-1][j] for j in range(M)]
# →
for j in range(1, M) :
startLeft[j] = max(startLeft[j], startLeft[j-1]+board[i][j])
# ←
for j in range(M-2, -1, -1) :
startRight[j] = max(startRight[j], startRight[j+1]++board[i][j])
# 선택
for j in range(M) :
board[i][j] = max(startLeft[j], startRight[j])
print(board[-1][-1])
'코딩테스트 > python' 카테고리의 다른 글
백준_가장 긴 증가하는 수열 세트 (1) (0) | 2022.03.22 |
---|---|
백준_1937_욕심쟁이 판다 (0) | 2022.03.22 |
백준_4386_별자리 만들기 (0) | 2022.03.17 |
백준_17387_선분 교차2 (0) | 2022.03.10 |
백준_2239_스도쿠 (0) | 2022.03.07 |
Comments