树上的等差数列(hihocoder1676)树形DP

这篇博客介绍了如何使用树形动态规划(DP)方法解决寻找一棵无根树中最长等差数列路径的问题。作者指出,关键在于理解在每个节点上,最长路径可能以该节点为端点或者包含该节点。通过维护一个以节点为端点的最长等差数列路径的映射(map),可以避免负数下标导致的问题,同时节省空间。博客提供了具体的AC代码实现。
摘要由CSDN通过智能技术生成

给定一棵包含N个节点的无根树,节点编号1~N。其中每个节点都具有一个权值,第i个节点的权值是Ai。  

小Hi希望你能找到树上的一条最长路径,满足沿着路径经过的节点的权值序列恰好构成等差数列。

Input

第一行包含一个整数N。  

第二行包含N个整数A1, A2, ... AN。  

以下N-1行,每行包含两个整数U和V,代表节点U和V之间有一条边相连。  

对于50%的数据,1 ≤ N ≤ 1000  

对于100%的数据,1 ≤ N ≤ 100000, 0 ≤ Ai ≤ 100000, 1 ≤ U, V ≤ N

Output

最长等差数列路径的长度

Sample Input

7  
3 2 4 5 6 7 5  
1 2  
1 3  
2 7  
3 4  
3 5  
3 6

Sample Output

4

主要思路:

这道题目难度不大。但在模拟赛的时候由于第二道模拟题肝不出来,看这题也没有想法。

首先,在每个节点的时候,如果其子树上的一条最长路径经过这个节点,则要么这个节点在端点上,要么这个节点在这个路径当中。用dp[x][j]+1(由于数列最短应该为1,而初始值为0,要更新会使代码更麻烦,不如直接不加,引用时+1就可以了)来表示以x为端点在其子树上差为j的数列最长有多长。

因此每次ans都要用dp[x][j]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值