这道题一开始看到的时候想先把二叉树剪出来,然后再找出叶子节点做一个动态规划,然后仔细一想发现,对于满二叉树来说,中序遍历的第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;
}