큰 수 만들기

큰 수 만들기

2019, Jun 02    
  • https://programmers.co.kr/learn/courses/30/lessons/12913
  • 기본적인 다이나믹 프로그래밍 문제입니다.
  • 행렬의 0행부터 끝행까지 각 행에서 1가지 원소를 선택하고 원소의 총합이 최대가 되도록 만드는 문제입니다.
  • 점화식은 다음과 같습니다.
    •  \(dp(i,j) = max(dp(i-1, k)) + land(i,j) (k = 0,1,2,3 and j \neq k)\)
  • 반복문을 수행한 다음에 가장 마지막 행의 최대값이 점수의 최대값이 됩니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<vector<int>> dp;

int solution(vector<vector<int> > land)
{
	int answer = 0;
	int N = land.size();
	int M = 4;
	dp = vector<vector<int>>(N, vector<int>(M, 0));
	dp[0][0] = land[0][0];
	dp[0][1] = land[0][1];
	dp[0][2] = land[0][2];
	dp[0][3] = land[0][3];

	for (int i = 1; i < N; ++i) {
		for (int j = 0; j < M; ++j) {
			if (j == 0) {
				dp[i][j] += max(dp[i - 1][1], max(dp[i - 1][2], dp[i - 1][3])) + land[i][j];
			}
			else if (j == 1) {
				dp[i][j] += max(dp[i - 1][0], max(dp[i - 1][2], dp[i - 1][3])) + land[i][j];
			}
			else if (j == 2) {
				dp[i][j] += max(dp[i - 1][0], max(dp[i - 1][1], dp[i - 1][3])) + land[i][j];
			}
			else if (j == 3) {
				dp[i][j] += max(dp[i - 1][0], max(dp[i - 1][1], dp[i - 1][2])) + land[i][j];
			}
		}
	}

	for (int i = 0; i < 4; ++i) {
		answer = max(answer, dp[N - 1][i]);
	}

	return answer;
}