版权声明:欢迎随便转载。 https://blog.csdn.net/a1214034447/article/details/82989056
题目链接:点击这里
解题思路:
g[i]表示i个点不做里面没有重儿子的最大花费值,dp[i]表示i个点的树的最大花费值.
因为每次i从1枚举,所以g[i]的树中,最大树节点数不会超过i.所以可以直接dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double pi = acos(-1);
const int mod = 313;
const int mx = 8005;
int g[mx],dp[mx],n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=0;j<=n-i;j++){
g[i+j] = max(g[i+j],g[j] + dp[i]);
dp[i+j+1] = max(dp[i+j+1],g[j] + dp[i] + j);
}
}
printf("%d\n",dp[n]);
return 0;
}