NC19810(kingdom )
感受
思路
#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;
}
查看19道真题和解析