uva1407 - Caves 树形DP

airodump-ng、aircrack-ng使用教程 wifi破解、airodump-ng、aircrack-ng脚本 阅读详情

It is said that the people of Menggol lived in caves. A tribe's caves were connected to each other with paths. The paths were so designed that there was one and only one path to each cave. So the caves and the paths formed a tree. There was a main cave, which connected the world outside. The Menggolian always carved a map of the tribe's caves on the wall of the main cave.

Scientists have just discovered Menggolian's tribe. What a heart-stirring discovery! They are eager to explore it. Since the terrain is very complex and dangerous, they decide to send out a robot.

The robot will be landed into the main cave, where he will begin his adventure. It doesn't have to return to the main cave, because the messages of his exploration will be sent immediately to the scientists while he is on the way.

A robot can only walk x meters before it runs out of energy. So the problem arises: given the map of the tribe's caves and a set of x, how many caves can be explored at most?

Input 

There are multiple test cases in the input file. Each test case starts with a single number n (0$ \le$n$ \le$500), which is the number of caves, followed by n - 1 lines describing the map. Each of the n - 1 lines contains three integers separated by blanks: i, j, and d (1$ \le$d$ \le$10000). It means that the i-th cave's parent cave is the j-th cave and the distance is d meters. A parent cave of cave i is the first cave to enter on the path from i to the main cave. Caves are numbered from 0 to n - 1. Then there is an integer q (1$ \le$q$ \le$1000), which is the number of queries, followed by q lines. For one query, there is one integer x (0$ \le$x$ \le$5000000), the maximum distance that the robot can travel. n = 0 indicates the end of input file.

Output 

For each test case, output q lines in the format as indicated in the sample output, each line contains one integer, the maximum number of caves the robot is able to visit.

Sample Input 

3 
1 0 5 
2 0 3 
3 
3 
10 
11 
0

Sample Output 

Case 1: 
2 
2 
3

 

  给你一棵树,知道各个节点之间的的距离。有Q个询问,每次询问一个路程,求从根出发走这个路程最多经过多少个节点(一个节点经过多次只算一次)。

  先算出经过1-N个节点的最小路程,询问的时候从后往前找。

  设dp[i][j][0]为以第i个节点为根经过j个节点并且回到根节点的最小路程,dp[i][j][1]为以第i个节点为根经过j个节点但是不回到根节点的最小路程。若v是u节点的子节点,w为u到v的距离,node[v]为以v为根的树的节点数量。那么有:

  dp[u][j][0]=min(dp[u][j][0],dp[u][j-k][0]+dp[v][k][0]+2*w)

  dp[u][j][1]=min(dp[u][j][1],min(dp[u][j-k][0]+dp[v][k][1]+w,dp[u][j-k][1]+dp[v][k][0]+2*w))

  注意k从1开始,循环进行条件是k<j&&k<=node[v]。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#define INF 0x3f3f3f3f
#define MAXN 510
#define MAXM 30
#define MAXT 1000010
#define MAXNODE 4*MAXN
#define pii pair<int,int>
using namespace std;
int N,Q,vis[MAXN],dp[MAXN][MAXN][2],node[MAXN];
vector<pii> V[MAXN];
int DFS(int u){
    vis[u]=1;
    node[u]=1;
    dp[u][1][0]=dp[u][1][1]=0;
    int L=V[u].size();
    for(int i=0;i<L;i++){
        int v=V[u][i].first,w=V[u][i].second;
        if(vis[v]) continue;
        node[u]+=DFS(v);
        for(int j=node[u];j>=2;j--){
            for(int k=1;k<j&&k<=node[v];k++){
                dp[u][j][0]=min(dp[u][j][0],dp[u][j-k][0]+dp[v][k][0]+2*w);
                dp[u][j][1]=min(dp[u][j][1],min(dp[u][j-k][0]+dp[v][k][1]+w,dp[u][j-k][1]+dp[v][k][0]+2*w));
            }
        }
    }
    return node[u];
}
int main(){
    freopen("in.txt","r",stdin);
    int cas=0;
    while(scanf("%d",&N),N){
        for(int i=0;i<N;i++) V[i].clear();
        for(int i=0;i<N-1;i++){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            V[u].push_back(make_pair(v,w));
            V[v].push_back(make_pair(u,w));
        }
        memset(vis,0,sizeof(vis));
        memset(dp,INF,sizeof(dp));
        int n=DFS(0);
        printf("Case %d:\n",++cas);
        scanf("%d",&Q);
        while(Q--){
            int x;
            scanf("%d",&x);
            for(int i=n;i>=1;i--) if(dp[0][i][1]<=x){
                printf("%d\n",i);
                break;
            }
        }
    }
    return 0;
}


UE4引擎分析获取UWord,GName,GetName,GObjectArray UE4引擎具有很多固定特征和特性 所以我们在逆向UE4引擎开发的游戏的时候,可以利用这些特征和特性. 当然,正常思路逆向也是没问题的(例如我们的ttw课程全数据逆向),你就当多了一个针对于该引擎逆向的快捷方式 或则多了一个思路即可. 正常逆向+引擎分析,使逆向结果全面且快速. 阅读详情

相关推荐

一种基于改进YOLOv8并与ORB-SLAM3融合的动态环境密集点云同步定位与建图(SLAM)方法

文章提出了一种基于改进 YOLOv8 与 ORB-SLAM3 融合的动态环境稠密点云 SLAM 方法,通过引入GSConv 卷积模块和VoVGSCSP 特征融合模块优化 YOLOv8 的轻量性,结合实时目标检测与语义分割技术去除动态特征点,显著提升了动态场景下的位姿估计精度。

2401_87345388的博客 1938

UVA 1407 - Caves

树形DP

ACoder 327

7-1 链式基数排序 (20 分)

7-1 链式基数排序 (20 分) 实现链式基数排序,待排序关键字n满足1≤n≤1000,最大关键字数位≤5。 输入样例: 第一行输入待排序个数n(1≤n≤1000),再输入n个数(n的数位≤5)。 10 278 109 63 930 589 184 505 269 8 83 输出样例: 输出每趟分配-收集后链表中的关键字,趟数为序列中最大值的数位(如样例中930的数位为3),每行结尾有空格。 930 63 83 184 505 278 8 109 589 269 505 8 109 930 63 26

OwemShu的博客 4236

uva 1407 Caves (树形背包dp)

题意 一棵n个节点的树,树的边有正整数权,表示两个节点之间的距离.你的任务是回答这样的询问:从跟节点出发,走不超过x单位的距离, 最多能经过多少节点?同一个节点经过多次, 只能算一个. 思路 这题同样是多天看的, 在今天才想出解法的. 动态规划就是这么有意思 :) 遍历n个节点, 有两种情况, 第一种是遍历完之后不回到出发点, 第二种是要回到出发点. 两种都可能会重复经过某些边, 但是显然还是第二种遍历的花费会更大 在这一题中, 遍历之后不需要回到出发点. f(i, j, 0): 表示

D_Double's Journey 3179

EB TRESOS 29.0.0安装教程用于MCAL配置开发

本文介绍的搭建基于NXP官网提供EB软件,进行基于标准AUTOSAR软件底层驱动配置的开发

qq_53260940的博客 1876

驯服电源尖峰:从BUCK/BOOST环路剖析到高di/dt噪声的实战抑制

本文深入探讨了电源系统中高di/dt噪声的产生机制及抑制方法,通过BUCK/BOOST电路的环路分析,揭示了电流路径不连续导致的电压尖峰问题。文章提供了实用的PCB布局技巧和噪声抑制策略,包括最短回路原则、铺铜优化和过孔阵列战术,帮助工程师有效降低EMI噪声,提升电源系统的稳定性。

weixin_29587015的博客 273

UVA1407 Caves

树形dp 题目大意: 一个n结点的有根树,树边权均为正数,现在有q次询问,每次询问一个距离,问这个距离从0号点出发最多能经过多少点,同一结点多次经过算1次。 n<=500,q<=1000 思路 我们考虑dp,一开始我用dp[i][j]表示i为根的子树走完j的距离后最多还能经过多少节点,不过空间不允许(too young too simple)。考虑点很少,用f[ i ][ j ]表示i...

weixin_30323631的博客 217

用OpenNI2获取奥比中光Astra Pro及 Astra Pro SM输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro,想在windows平台,和linux rk3588 上获取深度信息,之前的驱动下载已经不好用了。

babytiger的专栏 1303

UVA1407

一定距离走多远题目描述:给出n,表示有一个以0为根含有n个节点的树,每条边有一个权值,现在给出m次询问,每次询问有一个val值,要求计算在val值下的距离最多能经过多少个节点,一个节点多次移动多算一次.其中走的路程很大,点一共有500个题解:一共有两个重点.(1)点很少,距离很大,用dp的话要dp[u][i] = x,其中i是可以走的点的个数,而不是距离,用x来表示距离,这样之后扫一遍可以小于lim

ruclion的专栏 456

R语言使用mlr包创建回归任务、指定回归学习函数为KNN回归模型、网格搜索、交叉验证调节KNN模型的超参数K获取模型最佳的K值、可视化KNN模型的不同K值和MSE指标之间关系图

R语言使用mlr包创建回归任务、指定回归学习函数为KNN回归模型、网格搜索、交叉验证调节KNN模型的超参数K获取模型最佳的K值、可视化KNN模型的不同K值和MSE指标之间关系图

statistics+insight+vista+power 279

OpenCV C++ 图像处理实战 ——《基于轮廓比对的缺陷检测》

本文使用OpenCV C++ 实现基于轮廓比对的缺陷检测。

Zero___Chen的博客 1147

UVA 1407 Caves (树形dp)

题意: 有一颗树,树上的每条边有一个距离,一个人最多只能走W的路程,问这个人能走的最多的节点数是多少。每个测试实例有q个询问,每个询问给出一个W问对应能走的对打节点数。 题解: 这题显然不能用路程作为背包,反过来,用点数作为背包,路程作为价值,尽量让价值最小,首先用树形dp预处理出对应的最小价值,然后根据每个询问从节点大到小查找最大的节点数满足价值 #include #include #i

ACM之梦 688

AI上推荐 之 逻辑回归模型与GBDT+LR(特征工程模型化的开端)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 8251

UVA - 1407 Caves 树形dp 多重背包

分析 参考:https://www.jianshu.com/p/065cfa72e24b 状态的定义比较明显,主要是状态转移部分有点复杂,差点被绕晕了,现在觉得类似于多重背包问题 //0-1背包的枚举物品 for(int i=0;i<g[node].size();++i){ pair<int,int> &temp=g[node][i]; //为了放置重复计算,j从大到小进行更新 for(int j=tot[node];j&gt

zpf1998的博客 303

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

uva 1407 - Caves(树形dp)

题目链接:uva 1407 - Caves 题目大意:给出n,表示有一个以0为根含有n个节点的树,每条边有一个权值,现在给出m次询问,每次询问有一个val值,要求计算在val值下的距离最多能经过多少个节点,一个节点多次移动多算一次。 解题思路:dp[u][i]表示说以u为根,经过i个节点的最短距离,第三维有0和1两种状态,0是经过i个节点后要不用返回u,1是需要返回。这样就有(

不慌不忙、不急不躁 1993

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Caves - UVa 1407 树形dp

It is said that the people of Menggol lived in caves. A tribe's caves were connected to each other with paths. The paths were so designed that there was one and only one path to each cave. So the cave

提比的强行AC 679

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

UVA 1407 - Caves(树形DP)

It is said that the people of Menggol lived in caves. A tribe's caves were connected to each other with paths. The paths were so designed that there was one and only one path to each cave. So the cave

Remilia's 1675

UVA 1407 Caves(树形dp)

这题定义状态f[i][j][0]和f[i][j][1]。 f[i][j][0]表示遍历以i为根节点的子树的j个节点并且不回到节点i,那么状态方程为f[i][j][0]=min(f[i][j][0],min(f[i][j-k][1]+f[v][k][0]+w,f[i][j-k][0]+f[v][k][1]+2*w); f[i][j][1]表示遍历以i为根节点的子树的j个节点并且回到节点i,那么状

qq_33901573的博客 321

Uva 1407 Caves(树形dp)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4153 #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #inclu

左眼皮跳跳 400

UVA - 1407(Caves 树形dp 背包式)

和前一篇博客很相像 ; d[ 0] [ root ][ k ]表示从root出发不需要回到root需要走k个节点的最小路径长度; d[ 1] [ root ][ k ]表示从root出发必须要回到root需要走k个节点的最小路径长度; 再次说明一下本题目这样动态规划就从k =n 递减查找最优值d[ 0][ root ][ k ] 状态转移很清晰  such as  :  d[ 0 ][

playwfun的专栏 864

UVa 1407 Caves

本文探讨了机器人探索树形洞穴系统的最优路径问题。给定以0号洞穴为根的树结构,机器人从根出发,在不超过x米行走距离的限制下,求能访问的最大洞穴数。采用树形动态规划方法,定义两种状态:dp[u][k]表示访问k个节点后返回u的最小距离,f[u][k]表示不返回u的最小距离。通过背包式合并子树信息,预处理所有可能情况。对于每个查询x,只需在根节点处查找满足距离限制的最大k值。算法时间复杂度O(n³),空间复杂度O(n²),适用于n≤500的规模。该问题展示了树形DP在处理路径约束问题中的典型应用。

寂静山林 829

UVa 1407 树形背包 Caves

这道题可以和POJ 2486 树形背包DP Apple Tree比较着来做。 参考题解 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 u...

weixin_30859423的博客 101

uva 1407(树形dp)

题意:有一个机器人从一个节点进入一棵树,给出n个节点之间的距离,如果机器人的能量为x,也就是最多走x,且机器人不需要回到起点,问机器人最多能走多少个节点。 题解: f[i][j][0] : 遍历子树i的j个节点且最后不需要回到子树的根节点i最少用多少能量 f[i][j][1]:遍历子树i的j个节点且最后回到子树的根节点i最少用多少能量 首先要遍历出每个节点i有多少个子节点childnum[i

俯瞰风景 925

uva1407 树形分组背包

题目大意:一棵有根树,从根节点出发,移动距离不超过num,求最多能经历多少个点? 问题可以转化为“经历k个点最少移动多少距离”。 模型同hdu某次bestcoder第四题Cities。具体模型分析详见那题题解。 dp[u][k][0]:经过k个顶点不回到自身的最小移动距离 dp[u][k][1]:经过k个顶点回到自身的最小移动距离 dp[u][k][1]=min(dp[u][k]

acmer的随记 391

UVALive 4015 - Caves(树形DP)

题意:一棵n个节点的有根树,树的边有正整数权,表示两个节点之间的距离,你的任务是回答这样的询问,从根节点出发,走不超过x单位的距离,最多能走多少个节点,节点经过多次算一个,对于每次的询问输出:经过节点数最大的值。 注意题目给出的 i, j,d,其中 j 是 i 的父节点。 思路:树形DP,设 d[ i ][ j ][ k ] 表示以第i个节点为根节点的子树机器人访问j个节点走的最少的路程,k==0表示访问完后又回到i节点,k==1 表示访问完后不回来, 则状态转移方程为: d[x][j+k][0]

晚风中的自由 1434

UVALive - 4015 Caves

题意:一棵n个节点的有根树,树的边有正整数权,表示两个节点之间的距离,你的任务是回答这样的询问,从根节点出发,走不超过x单位的距离,最多能走多少个节点,节点经过多次算一个,对于每次的询问输出:经过节点数最大的值 思路:树形DP,因为最近做的树形DP,都是三维的,最后一维表示是与否的,所以 用d[i][j][c]表示以i为根节点的树经过了j个节点,1代表不返回i,0返回i,的最短距离

那些年 1352
上一篇: poj3225 Help with Intervals 线段树 区间交并补
下一篇: uva11889 - Benefit 数论
小小小小葱
博客等级 码龄14年 22粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值