获取生成数组中的最大值--利用树的性质做题
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取生成数组中的最大值--利用树的性质做题相关的知识,希望对你有一定的参考价值。
题目
解题分析
读完题目,我们根据这个递推关系,可以看出,这是
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
}
以上是关于获取生成数组中的最大值--利用树的性质做题的主要内容,如果未能解决你的问题,请参考以下文章
做题arc068_e-Snuke Line——利用特殊性质分讨
Codeforces 348E 树的中心点的性质 / 树形DP / 点分治