zoukankan      html  css  js  c++  java
  • 洛谷P2015二叉苹果树

    传送门啦

    树形 $ dp $ 入门题,学树形 $ dp $ 的话,可以考虑先做这个题。

    $ f[i][j] $ 表示在 $ i $ 这棵子树中选 $ j $ 个苹果的最大价值。

    include

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 105;
    
    inline int read(){
    	char ch = getchar();
    	int f = 1 , x = 0;
    	while(ch > '9' || ch < '0'){if(ch == '-')f = -1;ch = getchar();}
    	while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}
    	return x * f;
    }
    
    int n,q,u,v,w;
    int f[maxn][maxn],size[maxn];
    int head[maxn],tot;
    
    struct Edge{
    	int to,from,val,next;
    }edge[maxn << 1];
    
    void add(int u,int v,int w){
    	edge[++tot].from = u;
    	edge[tot].to = v;
    	edge[tot].val = w;
    	edge[tot].next = head[u];
    	head[u] = tot;
    }
    
    void dfs(int x,int fa){
    	size[x] = 1;
    	for(int i=head[x];i;i=edge[i].next){
    		int v = edge[i].to;
    		if(v != fa){
    			dfs(v , x);
    			size[x] += size[v];
    			for(int j=min(size[x],q);j>=1;j--)
    				for(int k=min(j-1,size[v]);k>=0;k--)
    					f[x][j] = max(f[x][j] , f[x][j-k-1] + f[v][k] + edge[i].val);
    		}
    	}
    }
    
    int main(){
    	n = read(); q = read();
    	for(int i=1;i<=n-1;i++){
    		u = read(); v = read(); w = read();
    		add(u , v , w);
    		add(v , u , w);
    	}
    	dfs(1 , 0);
    	printf("%d
    ",f[1][q]);
    	return 0;
    }
    顺风不浪,逆风不怂。
  • 相关阅读:
    13、文件修改及函数的基本使用
    12、文件处理 b模式
    作业3月16号
    作业3月13号
    11、文件处理 t模式
    10、数据类型内置之集合
    作业3月11号
    9、基础类型之列表、元组、字典
    作业3月10号
    8、for循环以及数字类型和字符串类型的内置方法
  • 原文地址:https://www.cnblogs.com/Stephen-F/p/9879701.html
Copyright © 2011-2022 走看看