[문제]
일렬로 놓아진 돈에 대해서, 연속으로 3개의 돈을 가질 수 없을 때 최대로 주울 수 있는 돈의 액수를 구하는 프로그램을 작성해라.
[풀이]
동적계획법 문제로 이전에 풀었던 포도주 시식 문제와 동일하다.
https://stritegdc.tistory.com/44
[코드]
#include <iostream>
#include <vector>
#define max(x,y) (x>y)?x:y
using namespace std;
// 돈의개수 n과 크기가 n인 수열 M이 주어졌을 때
// 주울 수 있는 최대 돈을 구하는 함수
int solution(int n, vector<int> M)
{
int answer = 0;
vector<int> m(n+1, 0);
m[0] = M[0];
m[1] = m[0] + M[1];
m[2] = max(m[0]+M[2], M[1]+M[2]);
for(int i=3; i<n; i++){
m[i] = max(m[i-2]+M[i], m[i-3]+M[i-1]+M[i]);
m[i] = max(m[i-1], m[i]);
}
answer = m[n-1];
return answer;
}
int main() {
int n;
cin >> n;
vector<int> M(n, 0);
for(int i=0; i<n; i++){
cin >> M[i];
}
int ans=solution(n,M);
cout << ans << endl;
return 0;
}
'알고리즘 공부 및 문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[기출 상] E-Queen - 백트래킹 (0) | 2021.09.18 |
---|---|
[기출 상] 집으로 가는 길(사다리 타기 문제) - 정렬 (0) | 2021.09.10 |
[기출 상] N개의 작업공정 - 위상정렬 (0) | 2021.09.08 |
[기출 상] 단어 게임 (0) | 2021.09.08 |
[기출 상] 백준 14891 톱니바퀴 (0) | 2021.09.08 |