hihocoder 1676 树上等差数列 黑科技树形dp
#1676 : 树上的等差数列
描述
给定一棵包含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的更多相关文章
- 中南大学oj 1317 Find the max Link 边权可以为负的树上最长路 树形dp 不能两遍dfs
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs.反例:5 41 2 22 ...
- [vijos1892]树上的最大匹配(树形DP)
题目:https://vijos.org/p/1892 分析:(100分其实用到各种c++优化,没什么实际意义,所以弄70就可以了) 题目很简单,很容易想出用树形DP,但是求方案数的时候,满满都是细节 ...
- 「HAOI2015树上染色」「树形DP」
其实我还不大会树形DP 此题就当练手叭,缕一下思路就好 题目链接 BZOJ4033 题目大意就是给一棵树,对一部分点染成黑色,剩下的为白色,问所有同色点距离之和....... 简明扼要的题意,然额我不 ...
- 【vijos】1892 树上的最大匹配(树形dp+计数)
https://vijos.org/p/1892 这个必须得卡评测机+手动开栈才能卡过QAQ 手动开栈我百度的... int size=256<<20; //256MB char *p=( ...
- Codeforces 919 行+列前缀和 树上记忆化搜索(树形DP)
A B C #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) ...
- [JSOI2016]最佳团体 DFS序/树形DP
题目 洛谷 P4322 [JSOI2016]最佳团体 Description 茜茜的舞蹈团队一共有\(N\)名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,茜茜的编号是\(0\)号.每个候 ...
- 树上的等差数列 [树形dp]
树上的等差数列 题目描述 给定一棵包含 \(N\) 个节点的无根树,节点编号 \(1\to N\) .其中每个节点都具有一个权值,第 \(i\) 个节点的权值是 \(A_i\) . 小 \(Hi\) ...
- ZJK的黑OJ(树的最大独立集)(树形DP)
ZJK的黑OJ zjk开了一家"善良OJ".这其实是家黑OJ.每AC一道题,网站便会自动在电脑上安装一种木马.zjk通过窃取信息获取收益(如网游帐号.OI资料.和KK的照片等等). ...
- 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分
树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...
随机推荐
- redis集群——RPLR简笔(Redis+PostgreSQL+Linux(centos7)+RabbitMQ)
使用的是centos7. 1.下载最新redis源码,解压(2016-05-12最新版本为3.2.0,3.0及以上才有官方集群) 2.进入源码根目录(此目录下的redis-stable目录),找到ut ...
- MFC TAB控件顺序
在MFC中添加控件后,按Ctrl+d可以改变控件TAB顺序,怕自己忘了,一个神奇的东西,记下. 关于改变Tab顺序的方法有以下几种: 方法一:在动态创建控件的时候STYLE设置成为WS_CHILD|W ...
- centos7mini版安装pyenv,ipython和jupyter环境.2090513
第一节: 搭建centos7下pyenv,ipython,jupyter环境 pyenv:是一个python多版本管理器,在这个里面可以安装多个版本共存,然后可以安装需求选择版本. ipython:就 ...
- for循环中索引值和取值的迷惑
利用for循环和range从100——10,倒序讲所有的偶数添加到一个新列表中,然后对列表的元素进行筛选,将能被4整除的数留下来. even = []for i in range(100,9,-1): ...
- C# Thu Mar 1 00:00:00 UTC+0800 2012 如何转换为2012-03-01
string s = "Thu Mar 1 00:00:00 UTC+0800 2012"; DateTime dt = DateTime.ParseExact(s, " ...
- How To:python pip install
官方网站 https://pypi.python.org/pypi/pip/ 下载需要的版本 wget https://pypi.python.org/packages/source/p/pi ...
- 笔记,js对象浅析
学习笔记, 来源:http://www.cnblogs.com/zuiyirenjian/p/3535126.html 作者:醉意人间 此外,关于自运行函数可参考 http://benalman. ...
- 洛谷——P1757 通天之分组背包
P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品 ...
- [ZJOJ] 5772【NOIP2008模拟】今天你AK了吗
Description AK:All kill“你为什么没背书?”“没有为什么,我就是没背书.”“……我去年买了个表,G—U—N!”头铁王InFleaKing把背书的时间都拿去列排列了......n= ...
- Spring MVC 笔记2 HelloWorld
实现这个例子的问题 WEB-INFO目录下必须有spring的包,放在lib下:如下图(这里我直接把idea创建时宣称springmvc,然后把idea给的lib拷贝了下来,也可以的) request ...