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;
}
每日一题 文章被收录于专栏

暑期每日一题,尽量日更

全部评论

相关推荐

头像
10-22 20:13
中南大学 Java
序言大家好呀。我是希晨er,一个初入职场的程序猿小登最近上班摸鱼刷到了一篇文章:10年深漂,放弃高薪,回长沙一年有感,还有聊聊30岁大龄程序员过往的心路历程,突然就有点感慨。我如今也做出了和大明哥一样的抉择,只是更早。此外我22年的人生,好像从来没好好记录过。正好现在工作不太忙,就想把这些经历写下来,也希望能得到社区里各位前辈的指点个人背景我是03年出生的西安娃,父母都是普通打工人。刚从中南大学软件工程专业毕业半年,现在在老家的央企过着躺平摆烂的日子成长轨迹从农村到城市的童年我家并不是西安的,只是爸妈在西安上班,从小学之后就把我接到了西安。后来老家房子拆了,爷爷奶奶也搬了过来。农村的生活,我觉...
Yki_:看哭了,恋爱那一段你女朋友说你不够关心她,可你毕竟也愿意遇到矛盾写几千字来和她慢慢分析;说不愿意给她花钱,我感觉可能只是消费观不一样;如果她想留在长沙,也应该提前跟你说开。不过她也许会心疼你放弃大厂offer转向数字马力?我也因为同样的原因有过一段幸福而充满遗憾的感情,不过跟爱情相比确实前途更重要一点。至于offer的选择,换我我也会这么选。把这些旧事记录下来以后,接下来就好好向前看吧,加油兄弟
🍊晨光随笔
点赞 评论 收藏
分享
LuvSran:是人我吃。老师就是学校呆久了,就业方面啥都不懂,还自以为是为了我们就业好。我学校就一破双非,计科入行率10%都没有,某老师还天天点名,说是出勤率抬头率前排率高了,华为什么的大厂就会来,我们就是不好好上课才没有厂来招。太搞笑了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务