1.トピック
インタビューの質問 17.16. マッサージセラピスト
2. アイデア (動的プログラミング)
- dp[i] を使用して、長さが i+1 の場合の最適な合計分数を記録します。たとえば、長さが 1 の場合、dp[0] が最適解です。
- dp を初期化します。i = 0 の場合、これは配列の最初の要素、つまり nums[0] です。i = 1 の場合、最初の 2 つの要素のうち最大のもの、つまり Math.max(nums[0],nums [1] を選択します。 ]))。
- i = 2 の後、現在の要素 nums[i] が選択されているかどうかに応じて、dp[i] には 2 つのケースがあります。nums[i] を選択すると、nums[i-1] を選択できません. このとき、最適解は dp[i] = dp[i - 2] + nums[i]; nums を選択しない場合[i] の場合、i - 1 のときの最適解 dp[i-1] である nums[i -1] を選択できます。これらの 2 つの値のうち最大のものを dp[i] として選択します。
- 最後に、n - 1 の添え字の dp 値を返すだけです。
3. コードの実装
var massage = function(nums) {
const n = nums.length
if (n === 0) return 0
let dp = []
dp[0] = nums[0]
dp[1] = Math.max(nums[0], nums[1])
for (let i = 2; i < n; i++) {
dp[i] = Math.max(dp[i - 1], nums[i] + dp[i - 2])
}
return dp[n - 1]
};
4. 参考
インタビューの質問 17.16. マッサージセラピスト