首页 > 编程语言 >二叉苹果树(C++)

二叉苹果树(C++)

时间:2024-07-17 14:58:51浏览次数:16  
标签:return mat int 树枝 C++ 二叉 苹果树 dp 105

【题目描述】

有一棵二叉苹果树,如果数字有分叉,一定是分两叉,即没有只有一个儿子的节点。这棵树共 

N 个节点,标号1 至 N ,树根编号一定为 1 。

我们用一根树枝两端连接的节点编号描述一根树枝的位置。一棵有四根树枝的苹果树,因为树枝太多了,需要剪枝。但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多能留住多少苹果。

 

【输入】

第一行两个数 N 和 Q ,N 表示树的节点数,Q 表示要保留的树枝数量。

接下来N−1行描述树枝信息,每行三个整数,前两个是它连接的节点的编号,第三个数是这根树枝上苹果数量。

【输出】

输出仅一行,表示最多能留住的苹果的数量。

【输入样例】

5 2
1 3 1
1 4 10
2 3 20
3 5 20

【输出样例】

21

【提示】
数据范围与提示:

对于 100 的数据,1≤Q≤N≤100,N≠1 ,每根树枝上苹果不超过 30000 个。

 

#include<bits/stdc++.h>
using namespace std;
int lson[105], rson[105], w[105];
int mat[105][105];
int n, q;

void dfs(int u) {
	for (int i = 1; i <= n; i++) {
		if (mat[u][i] >= 0) {
			lson[u] = i;
			w[i] = mat[u][i];
			mat[u][i] = mat[i][u] = -1;
			dfs(i);
			break;
		}
	}
	for (int i = 1; i <= n; i++) {
		if (mat[u][i] >= 0) {
			rson[u] = i;
			w[i] = mat[u][i];
			mat[u][i] = mat[i][u] = -1;
			dfs(i);
			break;
		}
	}
}
int dp[105][105];
int solve(int u, int x) {
	if (x == 0)return 0;
	if (u == 0) return -1e9;
	if(dp[u][x]!=-1)return dp[u][x];
	int res = -1e9;
	for (int i = 0; i < x; i++)
		res = max(res, solve(lson[u], i) + solve(rson[u], x - 1 - i) + w[u]);
	return dp[u][x]=res;	
}


int main() {
	cin >> n >> q;
	memset(mat, -1, sizeof(mat));
	memset(dp,-1,sizeof(dp));
	for (int i = 1; i <= n; i++) {
		int x, y, w;
		cin >> x >> y >> w;
		mat[x][y] = mat[y][x] = w;
	}
	dfs(1);
	cout << solve(1, q + 1);
    return 0;
}

 

标签:return,mat,int,树枝,C++,二叉,苹果树,dp,105
From: https://blog.csdn.net/qxh10/article/details/140418293

相关文章

  • 小球掉落(C++)
    #include<bits/stdc++.h>usingnamespacestd;structnode{ intid; booldata; intfather; intlson,rson;};nodetree[6000000];intd,i;intmain(){ cin>>d>>i; tree[1].father=0; tree[1].lson=2; tree[1].rson=3; tree[1].data=false;......
  • 找树根和孩子(C++)
    【问题描述】 给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子【输入格式】第一行:n(结点数<=100),m(边数<=200)。以下m行;每行两个结点x和y,表示y是x的孩子(x,y<=1000)。【输出格式】第一行:树根:root。第二行:孩子最多的结点max。第三行:max的孩子,按照从小到大的顺......
  • 基于SSM的校园志愿者管理系统小程序+99213(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    小程序+springboot校园志愿者管理系统摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,校园志愿者管理系统被用户普遍使用,为方便用户能够可以随时进行在线查看校园志愿......
  • 二叉树 部分定义与性质
    针对于知识回顾/复习,发现一些博客对于一些名词的定义各不相同,于是自己对于部分容易混淆的定义作一个简单的记录。详细关于二叉树的内容可以看:二叉树-Hello算法,部分博客内容来自其中。名词定义1.层层(Level):二叉树中的所有节点可以根据与根节点的距离分成不同的层次。根节点位......
  • 华为OD机试D卷 --找座位--24年OD统一考试(Java & JS & Python & C & C++)
    文章目录题目描述输入描述输出描述用例题目解析java源码python源码javascript源码c源码c++源码题目描述在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。现在给出一排观众座位分布图,座位中存......
  • 华为OD机试D卷 --密码输入检测--24年OD统一考试(Java & JS & Python & C & C++)
    文章目录题目描述输入描述输出描述用例题目解析java源码python源码javascript源码c源码c++源码题目描述给定用户密码输入流input,输入流中字符‘<’表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下的密......
  • C++ 贪心算法
    理解贪心算法贪心算法采用的是贪心策略在每一步中都采取最优解(局部最优解),以期望得到最终的全局最优解例子#include<iostream>#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta[510]={0};//表示每个人的打水时间的数组 intr,n,s=0;//水......
  • c++零基础知识要点整理(2)
    基本数据类型1.整数类型(1)short(短整型):占2个字节:00;         取值范围:-2^15~2^15-1(2)int(基本整数型) :占4个字节:0000;       取值范围:-2^31~2^31-1(3)long(长整型):占4个字节:0000;          取值范围:-2^31~2^31-1(4)long......
  • C++ 智能指针动态内存简单测试
    代码示例,主要来自《C++Primer》,动态内存相关那章内容。#include<iostream>#include<memory>#include<string>namespace{//未初始化的智能指针,默认保存的空指针voiddef_null_sp_test();//不是唯一用户,复制一份新的考拷贝。voidsp_unique_copy_te......
  • XX2104 培训【C++解决】
    描述某培训机构的学员有如下信息:姓名(字符串)年龄(周岁,整数)去年NOIP成绩(整数,且保证是5的倍数)经过为期一年的培训,所有同学的成绩都有所提高,提升了20%(当然NOIP满分是600分,不能超过这个得分)。输入学员信息,请设计一个结构体储存这些学生信息,并设计一个函数模拟培训......