感受

思路

图片说明











#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;
}