daimayuan 三进制循环(树形dp)

简介: daimayuan 三进制循环(树形dp)

题目传送门

这个题目比较简单,思路一下就出来了。

维护两个d p , d p 1 和 d p 2 : dp,dp1和dp2:dpdp1dp2:

d p 1 [ i ] : 以 点 i 为 起 点 以 及 子 树 符 合 取 模 递 增 的 最 大 长 度 dp1[i]:以点i为起点以及子树符合取模递增的最大长度dp1[i]:i

d p 2 [ i ] : 以 点 i 为 起 点 以 及 子 树 符 合 取 模 递 减 的 最 大 长 度 dp2[i]:以点i为起点以及子树符合取模递减的最大长度dp2[i]:i

答案就是:a n s = m a x ( a n s , Σ ( d p 1 [ i ] + d p 2 [ i ] − 1 ) ) ans=max(ans,\Sigma (dp1[i]+dp2[i]-1))ans=max(ans,Σ(dp1[i]+dp2[i]1))

代码:

/*********************************************************************
    程序名:
    版权:
    作者: Joecai
    日期: 2022-05-21 13:19
    说明:
*********************************************************************/
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
# define rep(i,be,en) for(int i=be;i<=en;i++)
# define pre(i,be,en) for(int i=be;i>=en;i--)
#define ll long long
#define endl "\n"
#define LOCAL
#define pb push_back
#define int long long
typedef pair<ll, ll> PII;
#define eb emplace_back
#define sp(i) setprecision(i)
const int N = 5e5 + 10, INF = 0x3f3f3f3f;
int n;
vector<int>g[N];
int w[N];
int dp1[N];//以这个点开始的如0 1 2 0
int dp2[N];
int ans = 0;
void  dfs(int u, int fa)
{
  dp1[u] = 1;
  dp2[u] = 1;
  for (auto x : g[u])
    {
      if (x == fa)
        continue;
      dfs(x, u);
      if ((w[x]) % 3 == (w[u] + 1) % 3)
        {
          dp1[u] = max(dp1[u], dp1[x] + 1);
        }
      if (w[x] % 3 == (w[u] - 1 + 3) % 3)
        {
          dp2[u] = max(dp2[u], dp2[x] + 1);
        }
    }
  ans = max(dp1[u] + dp2[u] - 1, ans);
}
void solve()
{
  cin >> n;
  for (int i = 1; i < n; i++)
    {
      int a, b;
      cin >> a >> b;
      g[a].push_back(b);
      g[b].push_back(a);
    }
  for (int i = 1; i <= n; i++)
    {
      cin >> w[i];
    }
  dfs(1, -1);
  cout << ans << endl;
}
signed main()
{
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  //#ifdef LOCAL
  //freopen("data.in.txt","r",stdin);
  //freopen("data.out.txt","w",stdout);
  //#endif
  int __ = 1;
  //cin>>__;
  while (__--)
    {
      solve();
    }
  return 0;
}


目录
相关文章
|
人工智能 网络协议 算法
5 分钟搞懂 ECN
5 分钟搞懂 ECN
3424 0
|
Java
SpringBoot 整合JWT实现基于自定义注解的-登录请求验证拦截(保姆级教学,附:源码)2
SpringBoot 整合JWT实现基于自定义注解的-登录请求验证拦截
422 0
|
大数据 数据管理 Docker
【Datahub系列教程】Datahub入门必学——DatahubCLI之Docker命令详解
【Datahub系列教程】Datahub入门必学——DatahubCLI之Docker命令详解
1175 0
|
弹性计算 运维 Kubernetes
全景剖析阿里云容器网络数据链路(一):Flannel
本文是[全景剖析容器网络数据链路]第一部分,主要介绍 Kubernetes Flannel 模式下,数据面链路的转转发链路。
全景剖析阿里云容器网络数据链路(一):Flannel
|
弹性计算 编解码 负载均衡
阿里云负载均衡SLB降价15%(NLB/ALB/CLB)
阿里云负载均衡SLB降价15%(NLB/ALB/CLB),阿里云产品大规模调价,核心云产品价格全线下调,技术红利释放核心产品最高降幅50%,以下产品的价格调整将于2023年5月7日生效,最终以产品详情页实际情况为准,阿里云百科分享阿里云官网发布的降价产品及降价幅度说明:
807 0
|
机器学习/深度学习 算法 数据挖掘
机器学习系列 | 02:聚类算法指标整理
本文主要整理记录聚类算法指标,以供参考
|
JavaScript 前端开发 Java
基于Springboot+MybatisPlus+Vue的前后端分离的学生选课课程教务管理系统
基于Springboot+MybatisPlus+Vue的前后端分离的学生选课课程教务管理系统
411 0
基于Springboot+MybatisPlus+Vue的前后端分离的学生选课课程教务管理系统
|
安全 Linux 数据安全/隐私保护
Linux与windows之间文件传输
Linux与windows之间文件传输
657 0

热门文章

最新文章