樹上的等差數列

題目鏈接:樹上的等差數列


顯然如果直接存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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章