牛牛种小树
牛牛種小樹
題意:
他打算用他得到的米粒去構造一棵有n個節點的樹,并使得它的價值最大。
設f(d)表示樹上度數為d的一個點能夠獲取的最大價值。則這棵樹的價值為∑i=1nf(di)\sum_{i=1}^nf(d_{i})∑i=1n?f(di?),其中did_{i}di?表示第i個點的度數
題解:
一顆n個節點的數,所有點的度數之和為2n-2
那我們可以反著理解,將這2n-2個度數分配給n個點,當然每個點至少度數為1,所以我們先給每個點分一個度數,這樣問題就是n-2個度數分配給n個點,f[i]表示度為i的節點的價值。這個問題就很類似完全背包了,f[i]是價值,空間為n-2,有n-2個物品(對應度數為2和度數為n-1,因為度數為1的提前處理了)。
注意度數為1的提前處理了,所以每次加入一堆時需要減去f(1)
代碼:
#include<iostream> #include<cstdio> #include<cmath> #define int long long using namespace std; int T,i,s,j,n,a[12020],f[12020];signed main() {scanf("%lld",&n);for (i=1;i<=n-1;i++){scanf("%lld",&a[i]);if (i!=1) a[i]-=a[1];}s=a[1]*n;for (i=1;i<=n-2;i++) f[i]=-2e18;f[0]=0;for (i=2;i<=n-1;i++)for (j=i-1;j<=n-2;j++)f[j]=max(f[j],f[j-i+1]+a[i]);printf("%lld\n",s+f[n-2]);return 0; }總結
- 上一篇: 电脑怎么录屏?这三个简单的电脑录屏方法,
- 下一篇: Emeditor——支持超大文件的文本编