日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛牛种小树

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛牛种小树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

牛牛種小樹

題意:

他打算用他得到的米粒去構造一棵有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; }

總結

以上是生活随笔為你收集整理的牛牛种小树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。