알고리즘/L16~17 동적계획법
16. 카드놀이
쿠쿠트레인
2022. 3. 14. 13:35
문제
N개의 카드가 주어지고, 각각은 자연수의 점수를 가진다. 철수는 이제 이 카드를 가져감으로써 카드에 적혀있는 수 만큼의 점수를 얻는다. 단, 카드를 가져갈 때 한가지 규칙이 있는데, 이는 연속하여 3개의 카드는 가져갈 수 없다는 것이다. 예를 들어, 6개의 카드 “1 3 5 2 7 3”가 주어질 경우, 3+5+7+3 = 18 만큼의 점수를 얻는 것이 최대이다. N개의 카드가 주어질 때, 얻을 수 있는 점수의 최댓값을 출력하는 프로그램을 작성하시오.
입력
첫 번째 줄에 N이 주어진다. ( 1 ≤ N ≤ 100,000 ) 두 번째 줄에 N개의 숫자가 주어지며, 이는 각 카드의 점수를 나타낸다.
출력
얻을 수 있는 점수의 최댓값을 출력한다.
예제 입력
6 1 3 5 2 7 3
예제 출력
18
#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
int n;
scanf("%d",&n);
int arr[100010];
int d[100010];
for(int i=1;i<=n;i++){
scanf("%d",&arr[i]);
}
d[0] = 0;
d[1] = arr[1];
d[2] = arr[1]+arr[2];
d[3] = max(arr[1]+arr[2], max(arr[1]+arr[3], arr[2]+arr[3]));
for(int i=3;i<=n;i++){
d[i] = max(d[i-1],max(d[i-2]+arr[i],d[i-3]+arr[i-1]+arr[i]));
}
printf("%d",d[n]);
return 0;
}