Study hard
(c++)프로그래머스 코딩테스트 연습 - 도둑질 본문
programmers.co.kr/learn/courses/30/lessons/42897
코딩테스트 연습 - 도둑질
도둑이 어느 마을을 털 계획을 하고 있습니다. 이 마을의 모든 집들은 아래 그림과 같이 동그랗게 배치되어 있습니다. 각 집들은 서로 인접한 집들과 방범장치가 연결되어 있기 때문에 인접한 ��
programmers.co.kr
[풀이]
DP로 풀어야 하는 문제였다.
첫번째 집과 마지막 집이 같이 선택되면 안되므로 첫번째 집을 선택하지 않는 경우와 첫번째 집을 선택하는 경우로 나누어서 풀어야한다.
#include <string>
#include <vector>
#include <algorithm>//max
using namespace std;
int *dp;
int house_cnt;
int DP(vector<int>money) {
dp[0] = money[0];
//첫번째 집 안 고르면
dp[1] = money[1];
dp[2] = max(dp[1], money[2]);
for (int i = 3; i < house_cnt; i++) {
dp[i] = max(dp[i - 2] + money[i], dp[i - 1]);
}
int m = dp[house_cnt - 1];
//첫번째 집 고르면
dp[house_cnt - 2] = money[house_cnt - 2];
dp[house_cnt - 3] = max(dp[house_cnt - 2], money[house_cnt - 3]);
for (int i = house_cnt - 4; i >= 0; i--) {
dp[i] = max(dp[i + 2] + money[i], dp[i + 1]);
}
m = max(m, dp[0]);
return m;
}
int solution(vector<int> money) {
int answer = 0;
house_cnt = money.size();
dp = new int[house_cnt];
answer = DP(money);
return answer;
}
'프로그래머스 > DP' 카테고리의 다른 글
(c++)프로그래머스 코딩테스트 연습 - 등굣길 (0) | 2020.10.20 |
---|---|
(c++)프로그래머스 코딩테스트 연습 - 정수 삼각형 (0) | 2020.10.20 |