原题链接:https://www.acwing.com/problem/content/4316/
从下往上,依次处理每个子树,对于每个子树,res += 这个子树的左右子树到叶节点最长路径的差的绝对值。每个子树处理好了,上边的自然也就好了啦。
#include<iostream>
#include<cmath>
#include<algorithm>
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 <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
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开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取。
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!
全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。