首页 > 其他分享 >P2014

P2014

时间:2023-05-10 14:11:45浏览次数:35  
标签:cnt P2014 310 head int edge dp

P2014

题意

  • 从一棵树中选择m条与根节点直接/间接相连的点,使得总权值最大

DP(树上背包)

状态: \(dp[i][j]\)表示在以\(i\)为根的子树中,选择了\(j\)个点的权值最大值

转移

  • 选择第k个点:\(dp[i][j]=dp[i][j-k]+dp[to][k]\)
  • 不选第k个点:\(dp[i][j]=dp[i][j]\)

决策:\(dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[to][k])\)

细节

  • \(k=0\)时没有父亲->把0作为根节点,从\(0\)开始DFS
  • 因为多加了一个\(0\)节点,所以边数\(m\)要\(+1\)

代码

#include <bits/stdc++.h>
using namespace std;
int n,m;
int dp[310][310];
int s,k;
struct edge{
    int to,next;
}edge[310];
int head[310],cnt;
void insert(int from,int to){
    edge[++cnt].to=to;
    edge[cnt].next=head[from];
    head[from]=cnt;
}
void DFS(int x){
    for(int i=head[x];i;i=edge[i].next){
        int to=edge[i].to;
        DFS(to);
        //转化成01背包:背包大小为m,物品大小为k
        for(int j=m;j>0;j--){   //想要到达x的儿子必须走x,所以不存在不选x而选x的儿子,即j不为0
            for(int k=0;k<j;k++){   //j-k不为0(理由同上),所以k<j而不是k<=j
                dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[to][k]);
            }
        }
    }
}
int main(){
    // freopen("1.in","r",stdin);
    cin>>n>>m;
    m++;
    for(int i=1;i<=n;i++){
        cin>>s>>dp[i][1];   //必须选自己
        insert(s,i);
    }
    DFS(0);
    cout<<dp[0][m]<<"\n";
}

标签:cnt,P2014,310,head,int,edge,dp
From: https://www.cnblogs.com/wangyangjena/p/17387821.html

相关文章

  • P2014 [CTSC1997] 选课
    P2014[CTSC1997]选课-洛谷|计算机科学教育新生态(luogu.com.cn)这题的技巧:把这些没有父亲节点的点,把他们的父亲节点令为0,则可从多课树变成一棵树。细节:由于0点是......
  • 洛谷 P2014 选课 树形依赖背包
    题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有N门功......
  • P2014 选课 ( 树上背包 )
    先看树上背包的板子:假设我们的树长这样:那么其实我们就有个比较朴素的想法:对一个结点对它的儿子们进行背包dp比如对于1号点我们就可以对2号3号进行背包dp问题是4......
  • P1941 [NOIP2014 提高组] 飞扬的小鸟 题解
    WC-2023上的题目。线性动态规划P1941[NOIP2014提高组]飞扬的小鸟我们先不管障碍物。设\(f[i][j]\)表示来到点\((i,j)\)的最少点击屏幕数。因为每秒要不上升\(......
  • 洛谷P2296 [NOIP2014 提高组] 寻找道路 题解
    题目链接:P2296[NOIP2014提高组]寻找道路-洛谷|计算机科学教育新生态(luogu.com.cn)好了,话不多说上代码:1#include<bits/stdc++.h>2usingnamespacestd;3......
  • 洛谷P2014 [CTSC1997] 选课
    sloj P2006.「树上背包」选课题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总......
  • 洛谷P2141 [NOIP2014 普及组] 珠心算测验
    [NOIP2014普及组]珠心算测验题目描述珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而......
  • LG2258 [NOIP2014 普及组] 子矩阵
    LG2258[NOIP2014普及组]子矩阵给出一个矩阵,求出一个子矩阵(对应在数列上的定义为子序列,从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵保持行与列的相对顺序......
  • LOJ #2500. 「NOIP2014」飞扬的小鸟
    题目链接:​​传送门​​不知不觉这么久没更了上了一阵子文化课,还比较颓没怎么做题就做了做noip历年的题也没什么好发的挑了一个,写了些注释#include<bits/stdc++.h>#def......
  • NOIP2014普及组复赛参考解析
    目录P2141[NOIP2014普及组]珠心算测验P2118[NOIP2014普及组]比例简化P2239[NOIP2014普及组]螺旋矩阵P2258[NOIP2014普及组]子矩阵题目传送P2141[NOIP2014......