感受
思路
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 8e3 + 10; ll ans[maxn], dp[maxn][maxn]; /**ans[i]表示i个节点构成的树最大贡献*/ /**dp[i][j]表示i个节点构成的森林中, |任意一棵树| <= j的最大贡献*/ int n; int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++){ for(int j = 1; j < i; j++){ ans[i] = max(ans[i], dp[i - j - 1][j] + ans[j] + i - j - 1); } for(int j = 1; j <= n; j++){ dp[i][j] = dp[i][j - 1]; if(i >= j){ dp[i][j] = max(dp[i][j], dp[i - j][j] + ans[j]); } } } printf("%lld\n", ans[n]); return 0; }