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
- Python
- Spring Boot
- bulk update
- 티스토리
- 카카오 인턴
- 호텔 방 배정
- 알고리즘
- 티스토리 open api
- 프로그래머스
- Open API
- trie
- 트라이
- 징검다리 건너기
- pycon
- CleanCode
- 트라이 #trie #알고리즘
- 가사 검색
- Tistory
- jdbc
- 크레인 인형뽑기 게임
- 보행자 천국
- 불량 사용자
- 튜플
Archives
- Today
- Total
택시짱의 개발 노트
[백준] 2169번 - 로봇 조종하기 본문
링크
https://www.acmicpc.net/problem/2169
풀이
로봇은 아래, 오른쪽 ,왼쪽 으로만 갈수 있다고 한다.
이때 맨 좌표의 맨 윗줄은 항상 오른쪽으로만 갈수 있기 때문에 첫줄은 오른쪽으로 값을 더해 준다.
이후 2번째 줄부터 N번째 줄까지는 x, y좌표에 도착 하려면 위, 오른쪽, 왼쪽에서 내려올수 있는 경우의 수가 있기 때문에
위에서 내려와 오른쪽으로 가는 값을 tmp[0] 배열에 저장하고
위에서 내려와 왼쪽으로 가는 값을 tmp[1] 배열에 저장하고
tmp[0], tmp[1]를 비교하여 큰값을 dp 배열에 넣어주면 된다.
#include<iostream>
#include<algorithm>
#define SIZE 1010
using namespace std;
int board[SIZE][SIZE];
int dp[SIZE][SIZE];
int tmp[2][SIZE];
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N, M; cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> board[i][j];
}
}
for (int j = 1; j <= M; j++) {
dp[1][j] += dp[1][j - 1] + board[1][j];
}
for (int i = 2; i <= N; i++) {
tmp[0][0] = dp[i - 1][1];
for (int j = 1; j <= M; j++) {
tmp[0][j] = max(dp[i - 1][j], tmp[0][j - 1]) + board[i][j];
}
tmp[1][M + 1] = dp[i - 1][M];
for (int j = M; j > 0; j--) {
tmp[1][j] = max(dp[i - 1][j], tmp[1][j + 1]) + board[i][j];
}
for (int j = 1; j <= M; j++) {
dp[i][j] = max(tmp[0][j], tmp[1][j]);
}
}
cout << dp[N][M];
}
반응형
'알고리즘' 카테고리의 다른 글
[프로그래머스] 올바른 괄호의 갯수 (2) | 2020.02.17 |
---|---|
[프로그래머스] 스티커 모으기(2) (0) | 2020.02.12 |
[프로그래머스] 정수 삼각형 (0) | 2020.02.07 |
[프로그래머스] 타일 장식물 (0) | 2020.02.07 |
[백준] 1339번 - 단어 수학 (0) | 2020.02.01 |
Comments