Get Maximum in Generated Array

easy dp simulation

Problem

An array nums of length n + 1 is generated by: nums[0] = 0, nums[1] = 1; for 2 ≤ 2i ≤ n, nums[2i] = nums[i]; for 2 ≤ 2i + 1 ≤ n, nums[2i + 1] = nums[i] + nums[i + 1]. Return the maximum value in nums.

Inputn = 7
Output3
nums = [0,1,1,2,1,3,2,3]; the maximum is 3.

def get_maximum_generated(n):
    if n == 0:
        return 0
    dp = [0] * (n + 1)
    dp[1] = 1
    for i in range(2, n + 1):
        dp[i] = dp[i // 2] if i % 2 == 0 else dp[i // 2] + dp[i // 2 + 1]
    return max(dp)
function getMaximumGenerated(n) {
  if (n === 0) return 0;
  const dp = new Array(n + 1).fill(0);
  dp[1] = 1;
  for (let i = 2; i <= n; i++) {
    dp[i] = i % 2 === 0 ? dp[i / 2] : dp[(i - 1) / 2] + dp[(i - 1) / 2 + 1];
  }
  return Math.max(...dp);
}
class Solution {
    public int getMaximumGenerated(int n) {
        if (n == 0) return 0;
        int[] dp = new int[n + 1];
        dp[1] = 1;
        int best = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = i % 2 == 0 ? dp[i / 2] : dp[i / 2] + dp[i / 2 + 1];
            best = Math.max(best, dp[i]);
        }
        return best;
    }
}
int getMaximumGenerated(int n) {
    if (n == 0) return 0;
    vector<int> dp(n + 1, 0);
    dp[1] = 1;
    int best = 1;
    for (int i = 2; i <= n; i++) {
        dp[i] = i % 2 == 0 ? dp[i / 2] : dp[i / 2] + dp[i / 2 + 1];
        best = max(best, dp[i]);
    }
    return best;
}
Time: O(n) Space: O(n)