这道题一开始看到的时候想先把二叉树剪出来,然后再找出叶子节点做一个动态规划,然后仔细一想发现,对于满二叉树来说,中序遍历的第1,3,5,7.。。项就是叶子节点。
那我们就可以直接获得叶子节点了, 然后用 表示前
个节点可以获得的最大粮食数,
可以从
(偷当前节点的粮食)和
(不偷当前节点的粮食)转移而来。
#include<iostream>
using namespace std;
const int MAXN = 1e5+10;
int main()
{
int n;
cin >> n;
int t;
for(int i = 0 ; i < n ; i++){cin >>t;}//忽略掉先序遍历
int arr[MAXN];
int dp[MAXN];
for(int i = 0 ; i < n ; i++)//取中序遍历的第1,3,5,7位
{
if(i%2==0){cin>>arr[i/2];}
else{cin>>t;}
}
dp[0] = arr[0];
dp[1] = max(arr[0],arr[1]);
for(int i = 2 ; i <= n/2 ; i++)//动态规划状态转移
{
dp[i] = max(dp[i-2]+arr[i],dp[i-1]);
}
cout<<dp[n/2];
return 0;
}

京公网安备 11010502036488号