Acwing42场周赛:搜索 贪心:满二叉树等长路径

原题链接:https://www.acwing.com/problem/content/4316/
Acwing42场周赛:搜索 贪心:满二叉树等长路径_第1张图片
从下往上,依次处理每个子树,对于每个子树,res += 这个子树的左右子树到叶节点最长路径的差的绝对值。每个子树处理好了,上边的自然也就好了啦。

#include
#include
#include

using namespace std;

const int N = 2050;

int a[N];
int res;
int n;

// 返回u节点到叶子节点的最长路径长度
int dfs(int u)
{
    if(u * 2  >= 1 << n + 1) return 0;
    int l = dfs(u * 2) + a[u * 2];
    int r = dfs(u * 2 + 1) + a[u * 2 + 1];
    
    res += abs(l - r);
    
    return max(l, r);
}

int main()
{
    cin >> n;
    for(int i = 2; i < (1 << n + 1); i ++)
        cin >> a[i];
    
    dfs(1);
    
    cout << res << endl;
    
    return 0;
}

记忆化代码:

#include 
#include 
#include 
#include 
using namespace std;

const int N = 2500;
int n;
int a[N] , d[N];


int main()
{
    scanf("%d", &n);
    for (int i = 2; i < pow(2,n+1); i ++ )
    {
        scanf("%d", &a[i]);
        d[i] = a[i] + d[i/2];
    }

    int res = 0;

    for(int i = pow(2,n+1)-1; i  > 1; )
    {
        d[(i-1)/2] = max(d[i],d[i-1]);
        res += max(d[i],d[i-1]) - min(d[i],d[i-1]);
        i -= 2;
    }
    cout << res << endl;

    return 0;
}

作者:_6
链接:https://www.acwing.com/solution/content/99467/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(java,后端,深度优先,贪心算法,算法)