P2015 二叉苹果树

P2015 二叉苹果树

类似于带限制背包问题,但不知道也能做。
n , q n,q n,q 范围小,大胆设 dp 状态。设 f u , i \large f_{u,i} fu,i 表示 u u u 子树内保留 i i i 根树枝的最大苹果数,可得状态转移方程 f u , i = f u , j + f v , i − j − 1 + w \large f_{u,i}=f_{u,j}+f_{v,i-j-1}+w fu,i=fu,j+fv,i−j−1+w,其中 w w w 指连接 u , v u,v u,v 的树枝上的苹果数, i − j − 1 i-j-1 i−j−1 而非 i − j i-j i−j 在于 u , v {u,v} u,v 这条边占了一根树枝。注意此时的 f u , j f_{u,j} fu,j 不能包含当前 v v v 所在的子树,原因很显然,同一个子树上的树枝不能被计算两次。

列完转移方程注意边界和外层循环。边界 f u . 0 = 0 f_{u.0}=0 fu.0=0,因为转移时 f u , i f_{u,i} fu,i 调用的 f u , j f_{u,j} fu,j 不能包含当前 v v v 所在的子树,所以应将 i i i 从大到小转移。

时间复杂度 O ( n q 2 ) O(nq^2) O(nq2)。

cpp 复制代码
在这里插入代码片#include<bits/stdc++.h>
using namespace std;
int n,q,p[105],f[105][105];
struct qh{
	int v,w,nt;
}E[205];
void add(int u,int v,int w){E[++p[0]]=(qh){v,w,p[u]};p[u]=p[0];return ;}
void dfs(int u,int fa){
	for(int i=p[u];i;i=E[i].nt){
		int v=E[i].v;
		if(v==fa) continue;
		dfs(v,u);
		for(int j=q;j>=1;j--) for(int k=0;k<=j-1;k++) f[u][j]=max(f[u][j],f[u][k]+f[v][j-k-1]+E[i].w);
	}return ;
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<n;i++){
		int u,v,w;scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	dfs(1,0);
	printf("%d",f[1][q]);
	return 0;
}
/*
start coding:18:47
finish debuging:19:03
*/

附上题目:

二叉苹果树

题目描述

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

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

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

复制代码
2   5
 \ / 
  3   4
   \ /
    1

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

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

输入格式

第一行 2 2 2 个整数 N N N 和 Q Q Q,分别表示表示树的结点数,和要保留的树枝数量。

接下来 N − 1 N-1 N−1 行,每行 3 3 3 个整数,描述一根树枝的信息:前 2 2 2 个数是它连接的结点的编号,第 3 3 3 个数是这根树枝上苹果的数量。

输出格式

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

样例 #1

样例输入 #1

复制代码
5 2
1 3 1
1 4 10
2 3 20
3 5 20

样例输出 #1

复制代码
21

提示

1 ⩽ Q < N ⩽ 100 1 \leqslant Q < N \leqslant 100 1⩽Q<N⩽100,每根树枝上的苹果 ⩽ 3 × 1 0 4 \leqslant 3 \times 10^4 ⩽3×104。

相关推荐
绿皮的猪猪侠2 分钟前
算法笔记上机训练实战指南刷题
笔记·算法·pta·上机·浙大
hie988941 小时前
MATLAB锂离子电池伪二维(P2D)模型实现
人工智能·算法·matlab
Jay_5151 小时前
C++多态与虚函数详解:从入门到精通
开发语言·c++
杰克尼1 小时前
BM5 合并k个已排序的链表
数据结构·算法·链表
.30-06Springfield2 小时前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习
我不是哆啦A梦2 小时前
破解风电运维“百模大战”困局,机械版ChatGPT诞生?
运维·人工智能·python·算法·chatgpt
xiaolang_8616_wjl2 小时前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
small_wh1te_coder2 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
FrostedLotus·霜莲2 小时前
C++主流编辑器特点比较
开发语言·c++·编辑器
挺菜的2 小时前
【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
java·开发语言·算法