获取生成数组中的最大值--利用树的性质做题

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取生成数组中的最大值--利用树的性质做题相关的知识,希望对你有一定的参考价值。

题目

解题分析

读完题目,我们根据这个递推关系,可以看出,这是 i2*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 / 点分治

LeetCode与《代码随想录》二叉树篇:做题笔记与总结-JavaScript版

LeetCode 1646 获取生成数组中的最大值[数组] HERODING的LeetCode之路