#1676 : 树上的等差数列

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

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

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

输入

第一行包含一个整数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

输出

最长等差数列路径的长度

样例输入

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

样例输出

4

大意:一棵树,每个点有一个权值,求树上连续节点能构成等差数列的最长长度。

题解:这题应该有很多种解法,我学习了其中一种非常简洁的:树形dp

不过状态数很多:f[节点][公差+delta] 肯定是不行的。

但是细想之后,发现状态很稀疏:公差很少,为每一个节点开一个map,当做数组用就行辣。

我的状态是f[i][j] 表示以 i 为序列的一头,公差为 j 的最长长度-1(不包括 i ,此细节无所谓)

需要注意公差为0 时的转移

ps: 话说大早上起来对拍调试真的爽!!emmm现在好像已经中午了(手动滑稽)

/*
Welcome Hacking
Wish You High Rating
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<map>
#include<vector>
using namespace std;
int read(){
int xx=0,ff=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
return xx*ff;
}
inline int mymax(int xx,int yy)
{if(xx>yy)return xx;return yy;}
const int maxn=100010;
int N,lin[maxn],len,v[maxn],ans=1;
struct edge{
int y,next;
}e[maxn<<1];
map<int,int>f[maxn];
inline void insert(int xx,int yy){
e[++len].next=lin[xx];
lin[xx]=len;
e[len].y=yy;
}
void dfs(int x,int fa){
for(int i=lin[x];i;i=e[i].next)
if(e[i].y!=fa){
dfs(e[i].y,x);
int diff=v[e[i].y]-v[x];
if(!diff){
ans=mymax(ans,f[x][0]+f[e[i].y][0]+2);
f[x][0]=mymax(f[x][0],f[e[i].y][0]+1);
}
else{
f[x][diff]=mymax(f[x][diff],f[e[i].y][diff]+1);
ans=mymax(ans,f[x][-diff]+f[x][diff]+1);
}
//printf("%d %d %d\n",x,diff,f[x][diff]);
}
}
int main(){
//freopen("in","r",stdin);
//freopen("out","w",stdout);
N=read();
for(int i=1;i<=N;i++)
v[i]=read();
for(int i=1;i<N;i++){
int t1=read(),t2=read();
insert(t1,t2);
insert(t2,t1);
}
dfs(1,0);
printf("%d\n",ans);
return 0;
}

  


hihocoder 1676 树上等差数列 黑科技树形dp的更多相关文章

  1. 中南大学oj 1317 Find the max Link 边权可以为负的树上最长路 树形dp 不能两遍dfs

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs.反例:5 41 2 22 ...

  2. [vijos1892]树上的最大匹配(树形DP)

    题目:https://vijos.org/p/1892 分析:(100分其实用到各种c++优化,没什么实际意义,所以弄70就可以了) 题目很简单,很容易想出用树形DP,但是求方案数的时候,满满都是细节 ...

  3. 「HAOI2015树上染色」「树形DP」

    其实我还不大会树形DP 此题就当练手叭,缕一下思路就好 题目链接 BZOJ4033 题目大意就是给一棵树,对一部分点染成黑色,剩下的为白色,问所有同色点距离之和....... 简明扼要的题意,然额我不 ...

  4. 【vijos】1892 树上的最大匹配(树形dp+计数)

    https://vijos.org/p/1892 这个必须得卡评测机+手动开栈才能卡过QAQ 手动开栈我百度的... int size=256<<20; //256MB char *p=( ...

  5. Codeforces 919 行+列前缀和 树上记忆化搜索(树形DP)

    A B C #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) ...

  6. [JSOI2016]最佳团体 DFS序/树形DP

    题目 洛谷 P4322 [JSOI2016]最佳团体 Description 茜茜的舞蹈团队一共有\(N\)名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,茜茜的编号是\(0\)号.每个候 ...

  7. 树上的等差数列 [树形dp]

    树上的等差数列 题目描述 给定一棵包含 \(N\) 个节点的无根树,节点编号 \(1\to N\) .其中每个节点都具有一个权值,第 \(i\) 个节点的权值是 \(A_i\) . 小 \(Hi\) ...

  8. ZJK的黑OJ(树的最大独立集)(树形DP)

    ZJK的黑OJ zjk开了一家"善良OJ".这其实是家黑OJ.每AC一道题,网站便会自动在电脑上安装一种木马.zjk通过窃取信息获取收益(如网游帐号.OI资料.和KK的照片等等). ...

  9. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

随机推荐

  1. DeltaFish 校园物资共享平台 第七次小组会议

    DeltaFish 校园物资共享平台 第七次小组会议 一.上周进度报告 前端 娄:和李一起建立前后端交互参数文档,和数据库文档,完成前端页面跳转和图片加载的 bug,Git 上去. 刘:优化前端 ab ...

  2. 移动web——bootstrap栅格系统

    基本简介 1.Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列 2.栅格系统用于通过一系列的行(row)与列(c ...

  3. ASP.NET MVC 二维码生成(ThoughtWorks.QRCode)

    原文地址http://www.cnblogs.com/jys509/p/4592539.html

  4. [Windows Server 2008] Serv-U安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Serv- ...

  5. DOM对象之window

    window的属性 top:返回当前窗口的最顶层的先辈窗口 document:返回HTML文档对象 location:当前窗口的地址 self:返回对自身窗口的引用 parent:返回父窗口 如何引用 ...

  6. 【Caffe】Ubuntu16.04上配置安装caffe(Only CPU)

    一.首先看看自己的系统,Ubuntu16.04,cpu,没有Nvidia,没有opencv 二.安装依赖包 安装protobuf,leveldb,snappy,OpenCV,hdf5, protobu ...

  7. .mm c++ oc 混编

    When you create a static library you don't link in the dependent libraries. As a result, when you re ...

  8. js 包管理工具

    环境 Windows10 + node 12.x + Webstorm 2019.1.3 工具 npm cnpm yarn npm/cnpm Webstorm 中第一次安装包一定几率卡死,很烦 不使用 ...

  9. java中一个数组不能放不同数据类型的值

    在java中,数组不能放不同数据类型的值. 方法一: 多态 定义数组类型的时候定义为父类,而存进数组为父类的子类 public class test2 { public static void mai ...

  10. 使用form标签时注意事项

    今天写程序的时候,使用了一个form:select标签,然后系统一直报错 原因找了好久也没找到 后来咨询得知, 在使用form:标签的时候  前后的form标签要写成<form:form> ...