๐งธ ์ ๋ต์ ๋ณด๊ณ ๋ ์ดํดํ๋๋ฐ ํ์ฐธ ๊ฑธ๋ ธ๋ค. dp๋ฌธ์ ๋ฅผ ๋ง์ด ํ์๋ค๊ณ ์๊ฐํ๋๋ฐ ์์ง ๋ฉ์๋ค.
๐จ ์ฐธ๊ณ ์ฝ๋
const fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const [T, W] = input.shift().split(" ").map(Number);
input = input.map(Number);
//[์๊ฐ][์ด๋ํ์]
const dp = Array.from(new Array(T + 1), () => new Array(W + 1).fill(0));
for (let i = 1; i <= T; i++) {
//1๋ฒ ๋๋ฌด์์ ํ ๋ฒ๋ ์์ง์ด์ง ์์ ๊ฒฝ์ฐ(j===0)
//์๋๊ฐ 1๋ฒ ๋๋ฌด์ ๋จ์ด์ง
if (input[i - 1] === 1) {
dp[i][0] = dp[i - 1][0] + 1;
}
//์๋๊ฐ 2๋ฒ ๋๋ฌด์ ๋จ์ด์ง
else {
dp[i][0] = dp[i - 1][0];
}
//ํ ๋ฒ ์ด์ ์์ง์ธ ๊ฒฝ์ฐ
for (let j = 1; j <= W; j++) {
//์๋๊ฐ 1๋ฒ ๋๋ฌด์์ ๋จ์ด์ง๊ณ , ์ด๋ํ์ ์ง์์ธ ๊ฒฝ์ฐ
if (input[i - 1] === 1 && j % 2 === 0) {
//์ด์ ์์น์์ ์์ง์ vs ๊ฐ๋งํ ์์
dp[i][j] = Math.max(dp[i - 1][j - 1] + 1, dp[i - 1][j] + 1);
}
//์๋๊ฐ 2๋ฒ ๋๋ฌด์์ ๋จ์ด์ง๊ณ , ์ด๋ํ์๊ฐ ํ์์ธ ๊ฒฝ์ฐ
else if (input[i - 1] === 2 && j % 2 !== 0) {
//์ด์ ์์น์์ ์์ง์ vs ๊ฐ๋งํ ์์
dp[i][j] = Math.max(dp[i - 1][j - 1] + 1, dp[i - 1][j] + 1);
}
//์๋์ ์์น์ ์ฌ๋์ ์์น๊ฐ ๋ค๋ฆ(์๋๋ฅผ ๋จน์ ์ ์์)
else {
//์์ง์ฌ์ ๋ชป๋จน์ vs ์์ง์ด์ง ์์์ ๋ชป๋จน์
dp[i][j] = Math.max(dp[i - 1][j - 1], dp[i - 1][j]);
}
}
}
console.log(Math.max(...dp[T]));