• 二叉苹果树


    https://www.luogu.com.cn/problem/P2015

    设f[i][j]表示以i为根的子树中保留j个枝最多剩多少苹果

    #include<bits/stdc++.h>
    using namespace std;
    int a[110][110],dp[110][110];
    int n,q;
    void dfs(int root,int fa)
    {
    	int x1=0,x2=0;
    	for(int i=1;i<=n;i++)
    	if(a[root][i]!=-1&&i!=fa) 
    	{
    		if(x1) x2=i;
    		else x1=i;
    		dfs(i,root);
    	}
    	for(int i=1;i<=q;i++)
    	{
    		dp[root][i]=max(dp[x1][i-1]+a[root][x1],dp[x2][i-1]+a[root][x2]);
    		for(int j=0;j<=i-2;j++)//注意循环的边界,从只取左儿子到只取右儿子
    		dp[root][i]=max(dp[root][i],dp[x1][j]+a[root][x1]+dp[x2][i-j-2]+a[root][x2]);
    	}
    }
    int main()
    {
    	memset(a,-1,sizeof(a));//一个枝上的苹果个数可以为0,初始化成-1作为区分
    	int x,y;
    	cin>>n>>q;
    	for(int i=1;i<n;i++)
    	{
    		cin>>x>>y;
    		cin>>a[x][y];
    		a[y][x]=a[x][y];
    	}
    	dfs(1,0);
    	cout<<dp[1][q];
    	return 0;
    }
    
  • 相关阅读:
    servlet
    过滤器
    拦截器
    logback
    hibernate(1)
    函数的关键字参数
    函数的不定长参数
    打印星形三角
    九九乘法表
    udp客户端收发数据流程
  • 原文地址:https://www.cnblogs.com/qwq-/p/13566327.html
Copyright © 2020-2023  润新知