題目鏈接:樹上的等差數列
顯然如果直接存dp[x][d] ,表示到點x公差爲d的最大長度。
空間不夠。
但是其實需要用到的d很少,所以直接用map存即可。
因爲葉子節點不好更新,所以我們dp[x][d]實際長度爲dp值加一即可。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,a[N],res;
vector<int> g[N]; map<int,int> dp[N];
inline void add(int a,int b){g[a].push_back(b),g[b].push_back(a);}
void dfs(int x,int fa){
for(auto to:g[x]) if(to!=fa){
dfs(to,x);
res=max(res,dp[x][a[x]-a[to]]+dp[to][a[to]-a[x]]+2);
res=max(res,dp[x][a[to]-a[x]]+dp[to][a[x]-a[to]]+2);
dp[x][a[x]-a[to]]=max(dp[x][a[x]-a[to]],dp[to][a[x]-a[to]]+1);
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1,a,b;i<n;i++) scanf("%d %d",&a,&b),add(a,b);
dfs(1,1);
cout<<res;
return 0;
}