NC19810(dp)

https://ac.nowcoder.com/acm/problem/19810
这题有个结论比较好猜……
题目大意是,给定n要求构造一棵权值最大的树,如果一个点是父亲的重儿子,那么权值等于父亲,否则等于父亲权值+1,根权值=0。
设i个节点的树的最大权值是dp[i],然后当我们想构造一棵大小为n的树时,根节点是0,接下来n-1个点形成一个森林,设其中最大树大小为k,那么dp[n]的值就由这些子树的dp值构成,其中,对于除了重子树的节点,都有额外的权值1,所以dp[n]=dp[k]+sum(dp[ai])+n-1-k,其中sum(ai)=n-k-1,max(ai)<=k。
所以核心算法就是,对于固定的n遍历其最大树k,然后对于每个k,找到合法森林的最大权值再加上n-k,这里的难题在于我们不知道对于剩下n-k个顶点如何构建出最大权值的森林。这时可以大胆做出一个猜测:将剩下n-k个点尽可能凑成k大的树,剩余不足的单独一棵树。因为最终结果一定是这种结构的,如果不是的话说明有别的树“性价比”更高,那就尽可能采用那棵树好了。
当然这个猜想也没证明正确,嘤嘤嘤,希望证实/伪的大佬可以分享一下

#include<bits/stdc++.h>
using namespace std;

const int maxn=8004;

int dp[maxn];

int main(){
    int n;
    cin>>n;
    for(int i=3;i<=n;i++){
        for(int j=1;j<i;j++){
            dp[i]=max(dp[i],(i-1)/j*dp[j]+dp[(i-1)%j]+i-1-j);
        }
    }
    cout<<dp[n]<<endl;
}
每日一题 文章被收录于专栏

暑期每日一题,尽量日更

全部评论

相关推荐

1.&nbsp;事件概述3月10日下午,华为在“心声社区”发布长达6500字通报,曝光72名正式员工及19名非雇员在非雇员招聘中存在徇私舞弊行为,多人出卖公司信息资产获利,引发热议。-&nbsp;“非雇员”一般指华为OD员工,与人力服务公司签劳动合同,以派遣方式到华为工作,薪资待遇与华为内部员工基本一致,可通过考核转正。2.&nbsp;相关传言与真相华为相关人士称暂无官方回应,很多传言细节不准确。&nbsp;华为成都研究所员工透露,此次通报主要涉及成都研究所的数据存储部门,整个数据存储业务约100余人,此次明文通报除名辞退或通报批评的有62名,“很多部门基本全开除”&nbsp;。网传任正非亲赴成都、封楼抓人等消息不实。早在2024年年中,就有...
七安有出处嘛:省流:任正非亲赴成都等消息不实,2024 年年中就有人举报了;涉及36名违规当事人,其中有13人被除名;10人有主动申报情节或情节较严重的,予以辞退处理;另有13人被劝退、个人职级降3等。另外还有26名相关管理责任人作为直接或间接管理者,被处以个人职级降6等,冻结个人涨薪、职级晋升、干部向上任命,冻结期6—12个月不等;若下属违规偶发,则仅通报批评。并没有释放100HC😂😂😂
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务