zoukankan      html  css  js  c++  java
  • P2015 二叉苹果树 树形dp

      

    题目描述

    有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)

    这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。

    我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树

    2   5
      / 
      3   4
        /
        1

    现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。

    给定需要保留的树枝数量,求出最多能留住多少苹果。

    输入输出格式

    输入格式:

    第1行2个数,N和Q(1<=Q<= N,1<N<=100)。

    N表示树的结点数,Q表示要保留的树枝数量。接下来N-1行描述树枝的信息。

    每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。

    每根树枝上的苹果不超过30000个。

    输出格式:

    一个数,最多能留住的苹果的数量。

    输入输出样例

    输入样例#1: 复制
    5 2
    1 3 1
    1 4 10
    2 3 20
    3 5 20
    
    输出样例#1: 复制
    21

    树形dp入门题
    f[u][i]=max(f[u][i],f[u][ij1]+f[v][j]+e[i].w)( 1imin(q,sz[u]),0jmin(sz[v],i1) )
    注意j k 的枚举范围

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define pb push_back
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    const int N=205;
    const int M=50005;
    int head[M],pos;
    struct Edge
    {
        int nex,to,v;
    }edge[M];
    void add(int a,int b,int c)
    {
        edge[++pos].nex=head[a];
        head[a]=pos;
        edge[pos].to=b;
        edge[pos].v=c;
    }
    int n,m;
    int dp[N][N];
    int siz[N];
    
    void dfs(int u,int fa)
    {
        for(int i=head[u];i;i=edge[i].nex)
        {
            int v=edge[i].to;
            if(v==fa)continue;
            dfs(v,u);
            siz[u]+=siz[v]+1;
            for(int j=min(m,siz[u]);j;--j)//保留的边数
            for(int k=min(j-1,siz[v]);k>=0;--k)//改子树保留的边数
            dp[u][j]=max(dp[u][j],dp[u][j-k-1]+dp[v][k]+edge[i].v);//注意差值为1
        }
    }
    
    int main()
    {
        RII(n,m);
        rep(i,1,n-1)
        {
            int a,b,c;RIII(a,b,c);
            add(a,b,c);add(b,a,c);
        }
        dfs(1,0);
        cout<<dp[1][m];
        return 0;
    }
    View Code




  • 相关阅读:
    How to function call using 'this' inside forEach loop
    jquery.validate.unobtrusive not working with dynamic injected elements
    Difference between jQuery.extend and jQuery.fn.extend?
    Methods, Computed, and Watchers in Vue.js
    Caution using watchers for objects in Vue
    How to Watch Deep Data Structures in Vue (Arrays and Objects)
    Page: DOMContentLoaded, load, beforeunload, unload
    linux bridge
    linux bridge
    EVE-NG网卡桥接
  • 原文地址:https://www.cnblogs.com/bxd123/p/10834633.html
Copyright © 2011-2022 走看看