博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ural 1018 (树形DP+背包+优化)
阅读量:6950 次
发布时间:2019-06-27

本文共 1187 字,大约阅读时间需要 3 分钟。

题目链接

题目大意:树枝上间连接着一坨坨苹果(不要在意'坨'),给定留下m根树枝,问最后剩下的最多苹果是多少。

解题思路

其实意思和(选课)的意思差不多。只不过权在边而已。

首先建无向图dfs。

for(f+1...j....cost)

  for(1....k...j-cost)

其中f为当前已经dfs子结点个数。之所以+1,是因为当前点也需要分配一根树枝才能取到这个点的苹果。

f+=dfs(t),dfs(t)返回的是子点t的f+1。

其实可以直接把f+1写成m+1, 不过要多好多次没必要的循环。

最后结果就是dp[1][m+1],注意由于树结构,1上的苹果是默认都能取到,但是按照这种DP方式要取到1上苹果,还需要加一个虚枝才行,也就是为什么是m+1。

 

#include "cstdio"#include "queue"#include "iostream"#include "cstring"using namespace std;#define maxn 105int n,m,dp[maxn][maxn],head[maxn],tol;struct Edge{    int next,to,w;}e[maxn*2];void addedge(int u,int v,int w){    e[tol].to=v;    e[tol].next=head[u];    e[tol].w=w;    head[u]=tol++;}int dfs(int root,int pre){    int cost=1,i=root,f=0;    for(int a=head[root];a!=-1;a=e[a].next)    {        int t=e[a].to;        if(t==pre) continue;        f+=dfs(t,root);        for(int j=f+1;j>=1;j--)            for(int k=1;k<=j-cost;k++)                dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[t][k]+e[a].w);    }    return f+cost;}int main(){    //freopen("in.txt","r",stdin);    int u,v,w;    scanf("%d%d",&n,&m);    memset(head,-1,sizeof(head));    for(int i=1;i

 

转载于:https://www.cnblogs.com/neopenx/p/4037505.html

你可能感兴趣的文章
iOS定位和位置信息获取
查看>>
Debian 7 安装Firefox
查看>>
ajax模式 同步和异步
查看>>
我喜欢的vs code快捷键for mac
查看>>
sql表的复制问题
查看>>
es6的新内容
查看>>
Java教程
查看>>
跟着大神学zookeeper分布式锁实现-----来自Ruthless
查看>>
vue2.0 兼容ie9及其以上
查看>>
Xml中SelectSingleNode方法,xpath查找某节点用法
查看>>
JAVA - JAVA编译运行过程
查看>>
计时器setInterval
查看>>
iOS开发个人开发账号的证书详细使用及介绍
查看>>
尺取法
查看>>
Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk
查看>>
NOIP-珠心算
查看>>
使用crypt配置Basic Auth登录认证
查看>>
sklearn
查看>>
linux命令系列目录
查看>>
sql server 2008学习1–系统数据库
查看>>