도둑이 어느 마을을 털 계획을 하고 있습니다. 이 마을의 모든 집들은 아래 그림과 같이 동그랗게 배치되어 있습니다.
각 집들은 서로 인접한 집들과 방범장치가 연결되어 있기 때문에 인접한 두 집을 털면 경보가 울립니다.
각 집에 있는 돈이 담긴 배열 money가 주어질 때, 도둑이 훔칠 수 있는 돈의 최댓값을 return 하도록 solution 함수를 작성하세요.
(첫번째 항 포함, 마지막 항 미포함)
과 (첫번째 항 미포함, 마지막 항 포함)
으로 DP 두 번 돌려서 최댓값 고르면 된다.D[i] = max(D[i-2] +arr[i], D[i-1)
추가했다.
근데 제일 앞에 나오는 3단계 DP는 아직 못 풀었다.
DP가 들어가면 일단 난이도가 높게 나오는 것 같다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int dp1[1000000];
int dp2[1000001];
int solution(vector<int> money) {
int len = money.size();
dp1[0] = money[0];
dp1[1] = max(money[0], money[1]);
for(int i=2; i<len-1; i++){
dp1[i] = max(dp1[i-2]+money[i], dp1[i-1]);
}
dp2[1] = money[1];
for(int i=2; i<len; i++){
dp2[i] = max(dp2[i-2]+money[i], dp2[i-1]);
}
return max(dp1[len-2], dp2[len-1]);
}
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int dp[1000000];
int solution(vector<int> money) {
int answer;
int len = money.size();
dp[0] = money[0];
dp[1] = max(money[0], money[1]);
for(int i=2; i<len-1; i++){
dp[i] = max(dp[i-2]+money[i], dp[i-1]);
}
answer = dp[len-2];
dp[0] = 0;
dp[1] = money[1];
for(int i=2; i<len; i++){
dp[i] = max(dp[i-2]+money[i], dp[i-1]);
}
answer = max(answer, dp[len-1]);
return answer;
}