https://www.acmicpc.net/problem/22342
22342번: 계산 로봇
M개의 행(가로줄)과 N개의 열(세로줄)이 있는 격자의 각 칸에는 로봇이 있다. 각 행에는 위에서부터 아래로 1부터 M까지의 번호가 붙어 있고, 각 열에는 왼쪽에서부터 오른쪽으로 1 부터 N까지의
www.acmicpc.net
솔루션
맞왜틀로 골머리를 앓았다. DP 문제인 건 알겠으나,
r-1, c-1
r , c-1
r+1, c-1 중에서 최대 값을 저장 값으로 해 주었으나 어딜 틀렸는지 모르겠어 머리를 쥐어짜다 이리저리 수정하다 보니 성공했다.
일단 점화식이 다음과 같은 3가지 경우만 나눠지는 이유는
저장 값은 -1보다 더 이전 열에서 갖고 올 수 있지만 -1에서 더 이전의 열에서 가장 높은 저장 값을 가져와 저장 할 것이다.
그러면 이전 열의 값은 더 이전 열에서의 최대 저장 값 + 현재 가중치 까지 더한 것이 출력 값이 되기 떄문에 무조건 이전 열에서 가져오는 것이 더 이득이다. (다 양수이기 때문)
그런데 나는 기저 조건의 위치를 잘 못 적어서 틀렸었다..
코드
#include <iostream>
using namespace std;
int N, M;
string str[2002];
int arr[2002][2002];
int dp[2002][2002];
int solve(int r, int c) {
if (r < 0 || c < 0 || r >= N) return 0;
if (c == 0) return arr[r][c];
if (dp[r][c]) return dp[r][c] + arr[r][c];
int& ref = dp[r][c];
int maxValue = max(solve(r, c - 1), solve(r - 1, c - 1));
maxValue = max(maxValue, solve(r + 1, c - 1));
ref = maxValue;
return arr[r][c] + ref;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
for (int i = 0; i < N; i++) {
cin >> str[i];
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
arr[i][j] = str[i][j] - '0';
}
}
int ans = -987654321;
for (int i = 0; i < N; i++) {
ans = max(ans, solve(i, M - 1) - arr[i][M - 1]);
}
cout << ans << '\n';
}
'백준' 카테고리의 다른 글
C++[백준]20303번 할로윈의 양아치 (0) | 2023.07.04 |
---|---|
C++[백준]1915번 가장 큰 정사각형 (0) | 2023.06.23 |
C++[백준]14846번 직사각형과 쿼리 (0) | 2023.05.29 |
C++[백준]1658번 돼지 잡기 (2) | 2023.05.29 |
C++[백준]1996번 지뢰 찾기 (0) | 2023.05.29 |