포도주를 마시는데 세 잔 연속으로 마실 수 없고, 최대한 많이 마시는 문제
작년에도 파이썬으로 이 문제를 풀었었는데 이번에도 금방 풀지 못했다. 규칙을 잘 찾았어야지!
경우의 수는 3가지가 있다.
1. i번째 포도주와 i-1번째 포도주를 마시고 i-3번째까지의 포도주를 마시는 경우
-> wine[i] + wine[i - 1] + dp[i - 3]
2. i번째 포도주와 i-2번째까지의 포도주를 마시는 경우
-> wine[i] + dp[i - 2]
3. i-1번째까지의 포도주를 마시는 경우
-> dp[i-1]
위의 경우의 수에서 최댓값을 추가한다.
const fs = require("fs");
const arr = fs
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n")
.map(Number);
const n = arr.shift();
const dp = new Array(10000).fill(0);
dp[0] = arr[0];
dp[1] = arr[0] + arr[1];
dp[2] = Math.max(dp[1], arr[2] + arr[1], arr[2] + arr[0]);
for (let i = 3; i < n; i++) {
dp[i] = Math.max(dp[i - 1], arr[i] + arr[i - 1] + dp[i - 3], arr[i] + dp[i - 2]);
}
console.log(dp[n - 1]);