题目大意:
给出一个N(N<100)节点的完全二叉树,每个节点为一个数值。
可以选择部分节点,选取原则是一个节点的子节点只要有一个(两个节点可以都被选)被选择,它就不能再被选。
求选取给定二叉树节点能达到的最大数值。
样例:
输入:
9
5194 34 91 51 72 46 12 9812 6054
输出:
21190
解题思路:
DP,笔试前看了很多dp的内容,果然有用~ 但别问为什么这样写,我也很懵逼...代码改着改着就过了...
贴出我的破烂代码,纪念一下这次的陪跑,请大家多指教~~
AC代码:
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
const int maxn=1000005;
int main()
{
int n;
int a[maxn];
scanf("%d",&n);
int dp[2][maxn]={0};
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
dp[1][n]=a[n];
dp[1][n-1]=a[n-1];
for(int i=n;i--;)
{
dp[0][i]=dp[1][2*i]+dp[1][2*i+1];
dp[1][i]=max(dp[0][2*i]+dp[0][2*i+1]+a[i],dp[1][2*i]+dp[1][2*i+1]);
if(i<0)break;
}
printf("%d\n",max(dp[1][1],dp[0][1]));
}