
n이 주어졌을 때 dp[n]이 와인을 마실수 있는 최대값이라고 하고 아래 3가지 경우 중 가장 많이 마실 수 있는 경우 즉, 가장 큰 값을 골라주면 된다.
- dp[n-3] + wine[n-1] + wine[n]
- dp[n-2] + wine[n]
- dp[n-1]
(입력값으로 주어진 wine 배열은 맨 앞에 요소를 추가해주어 dp테이블과 길이가 같도록 만들어 주었다.)
이를 코드로 구현해 보면 아래와 같다.
const filePath = process.platform === 'linux' ? '/dev/stdin' : './Javascript/input.txt';
const input = require('fs').readFileSync(filePath).toString().trim().split('\n').map(Number);
const [n, ...wine] = input;
const dp = Array(n + 1).fill(0);
wine.unshift(0);
dp[1] = wine[1];
dp[2] = wine[1] + wine[2];
for (let i = 3; i <= n; i++) {
dp[i] = Math.max(dp[i - 3] + wine[i - 1] + wine[i], dp[i - 2] + wine[i], dp[i - 1]);
}
console.log(dp[n]);
const filePath = process.platform === 'linux' ? '/dev/stdin' : './Javascript/input.txt';
const input = require('fs').readFileSync(filePath).toString().trim().split('\n');
const n = +input[0];
const wine = input.slice(1).map(Number);
const dp = Array.from({ length: 2 }, () => Array(n).fill(0));
dp[0][0] = wine[0];
dp[1][0] = wine[0];
dp[0][1] = dp[1][0] + wine[1];
dp[1][1] = wine[1];
for (let i = 2; i < n; i++) {
dp[0][i] = dp[1][i - 1] + wine[i];
dp[1][i] = dp[0][i - 2] + wine[i];
}
let answer = 0;
for (let i = 0; i < n; i++) {
const max = Math.max(dp[0][i], dp[1][i]);
answer = Math.max(max, answer);
}
console.log(answer);
