测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A18425. 满二叉树

填空题 困难

题目描述

满二叉树

题目描述

给定一棵包含 n 个结点的有根二叉树,结点依次以 1,2,...,n 编号,根结点编号为 1。

对于结点 i,其左儿子的编号记为 li,右儿子编号记为 ri。特别地,如果左儿子不存在则 li=0,如果右儿子不存在则 ri=0。

树中每个结点都对应一棵以其为根的子树。请你求出给定有根树的所有 n 棵子树中,有多少棵子树是满二叉树。

满二叉树是指所有叶子深度均相同,且除叶子外均有两个儿子的二叉树,例如以下三棵二叉树均是满二叉树:

例如,

在上面这棵有 个节点的二叉树中,有 个子树是满二叉树(包括整个树本身,及所有的单个叶子节点);

又例如,

在上面这棵有 个节点的二叉树中,有 个子树是满二叉树(包括节点 的子树,以及所有单个叶子节点)。

输入格式

第一行,一个正整数 ,表示有根二叉树结点数量。

接下来 行,每行两个非负整数 ,表示结点 的左儿子编号和右儿子编号,整数之间以空格分隔。

输出格式

输出一行,一个整数,表示所有子树中满二叉树的数量。

样例

输入样例 1

4
2 3
4 0
0 0
0 0

输出样例 1

2

输入样例 2

3
2 3
0 0
0 0

输出样例 2

3

数据范围

对于40% 的测试点,保证 1≤n≤500。

对于所有测试点,保证 1≤n≤105


参考答案

#include <iostream> using namespace std; int dp[1010], p[1010]; int main() { int n; cin >> n; for (int i = 1; i <= n; ++i) cin >> p[i]; for (int i = 1; i <= n; ++i) { for (int j = i; j <= n; ++j) { dp[j] = max(dp[j], dp[j - i] + p[i]); } } cout << dp[n] << endl; return 0; }
上一题 下一题