题目
解题分析
读完题目,我们根据这个递推关系,可以看出,这是
i
和2*i
以及2*i+1
之间的关系,很明显这是一个数组型二叉树中子与父的关系,同样,只要i>=1
则它的父亲结点一定是i/2
,根据题中关系nums[2 * i + 1] = nums[i] + nums[i + 1]
可知,每一个i
不仅可能与i/2
有关系,一旦i
为奇数,则还与i/2+1
有关,所以得出推导式:
dp[i] = dp[i/2] + i%2*dp[i/2+1]
- 实际它给出关系的时候,就已经可以用数学中的换元法把题目中的
i*2
或者i*2+1
换成i
了。
解题代码
C++解题
class Solution {
public:
int getMaximumGenerated(int n) {
if (n == 0) {
return 0;
}
vector<int> nums(n + 1);
nums[1] = 1;
for (int i = 2; i <= n; ++i) {
nums[i] = nums[i / 2] + i % 2 * nums[i / 2 + 1];
}
return *max_element(nums.begin(), nums.end());
}
};
Go语言
func getMaximumGenerated(n int) (ans int) {
if n == 0 {
return
}
nums := make([]int, n+1)
nums[1] = 1
for i := 2; i <= n; i++ {
nums[i] = nums[i/2] + i%2*nums[i/2+1]
}
for _, v := range nums {
ans = max(ans, v)
}
return
}
func max(a, b int) int {
if a > b {
return a
}
return b
}