题意:

  给你一棵树,n个节点,每条边有长度。

  然后有q组询问(u,k),每次问你:从节点u出发,走到某个节点的距离mod k的最大值。

题解:

  对于无根树上的dp,一般都是先转成以1为根的有根树,然后分别从上到下和从下到上两遍dp。

  另一个技巧是:处理重复走边的情况时,可以让dp值表示达到某种状态的方案数。

  表示状态:

    dp[i][j][k] = max dis

    表示从i节点出发,走的距离mod k = j时的方案数

  找出答案:

    对于每次询问(u,k),答案为:满足dp[u][d][k]>0的最大的d值。

  如何转移:

    第一遍dfs:

      dp[i][(j+len)%k][k] = ∑ dp[son][j][k]

      只考虑从上往下的路径。

    第二遍dfs:

      dp[i][(j+len)%k][k] += dp[par][j][k]

      dp[i][(j+len)%k][k] -= old[i][((j-len)%k+k)%k][k]

      其中old[i][j][k]代表原来的dp,即只考虑从上往下时的dp。

      减去old是因为要将会导致重复走边的方案删去。

  边界条件:

    dp[i][0][k] = 1

    others = 0

  复杂度:

    Tree dp: O(n*k*k)

    Query: O(q*k)

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 3005
#define MAX_K 105 using namespace std; struct Edge
{
int dst;
int len;
Edge(int _dst,int _len)
{
dst=_dst;
len=_len;
}
Edge(){}
}; int n,q;
int dp[MAX_N][MAX_K][MAX_K];
int old[MAX_N][MAX_K][MAX_K];
vector<Edge> edge[MAX_N]; void read()
{
cin>>n;
int x,y,z;
for(int i=;i<n;i++)
{
cin>>x>>y>>z;
edge[x].push_back(Edge(y,z));
edge[y].push_back(Edge(x,z));
}
} void dfs1(int now,int p)
{
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(temp.dst!=p) dfs1(temp.dst,now);
}
for(int k=;k<=;k++)
{
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(temp.dst!=p)
{
for(int j=;j<k;j++)
{
dp[now][(j+temp.len)%k][k]+=dp[temp.dst][j][k];
}
}
}
}
} void dfs2(int now,int p,int l)
{
if(p!=-)
{
for(int k=;k<=;k++)
{
for(int j=;j<k;j++)
{
old[now][j][k]=dp[now][j][k];
}
}
for(int k=;k<=;k++)
{
for(int j=;j<k;j++)
{
dp[now][(j+l)%k][k]+=dp[p][j][k];
dp[now][(j+l)%k][k]-=old[now][((j-l)%k+k)%k][k];
}
}
}
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(temp.dst!=p) dfs2(temp.dst,now,temp.len);
}
} void work()
{
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
{
for(int k=;k<=;k++)
{
dp[i][][k]=;
}
}
dfs1(,-);
dfs2(,-,);
cin>>q;
int u,k;
while(q--)
{
cin>>u>>k;
for(int d=k-;d>=;d--)
{
if(dp[u][d][k])
{
cout<<d<<endl;
break;
}
}
}
} int main()
{
read();
work();
}

TYOI Day1 travel:Tree dp【处理重复走边】的更多相关文章

  1. 96. Unique Binary Search Trees (Tree; DP)

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  2. HDU 4359——Easy Tree DP?——————【dp+组合计数】

    Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  3. HDU 4359 Easy Tree DP?

    Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  4. poj 3230 Travel(dp)

    Description One traveler travels among cities. He has to pay for this while he can get some incomes. ...

  5. Codeforces 442D Adam and Tree dp (看题解)

    Adam and Tree 感觉非常巧妙的一题.. 如果对于一个已经建立完成的树, 那么我们可以用dp[ i ]表示染完 i 这棵子树, 并给从fa[ i ] -> i的条边也染色的最少颜色数. ...

  6. HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)

    Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  7. HDU3534(SummerTrainingDay13-C tree dp)

    Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. BZOJ.1576.[Usaco2009 Jan]安全路经Travel(树形DP 并查集)

    题目链接 BZOJ 洛谷 先求最短路树.考虑每一条非树边(u,v,len),设w=LCA(u,v),这条边会对w->v上的点x(x!=w)有dis[u]+dis[v]-dis[x]+len的距离 ...

  9. Partial Tree(DP)

    Partial Tree http://acm.hdu.edu.cn/showproblem.php?pid=5534 Time Limit: / MS (Java/Others) Memory Li ...

随机推荐

  1. executable null\bin\winutils.exe in the Hadoop binaries.

    在windows 使用eclipse远程调用hadoop集群时抛出下面异常 executable null\bin\winutils.exe in the Hadoop binaries. 这个问题 ...

  2. spring事务管理实现方式

    声明式事务 tx及aop配置,利于管理,耦合性低,可读性低 @Transactional注解,不利管理,耦合性高,可读性高 编程式事务 TransactionTemplate类,spring推荐方法 ...

  3. iOS 控制器title和tabbar的title设置问题

    iOS 设置tabbarItem的title的是通过 controller.tabBarItem.title = @"标题" iOS 设置导航栏控制器title通过 contoll ...

  4. args *args **kwargs区别

    python 函数中的参数类型有两种,分别为 位置参数和关键字参数: 一 .位置参数(该类参数位置固定不变) args:     表示默认位置参数,该参数是具象的,有多少个参数就传递多少参数,且参数位 ...

  5. 用PreferenceActivity做一个标准的设置界面

    最后接触到一个任务,做一个工厂设置,在我看来工厂设置不需要多美观,但是一定要方便修改,添加功能,再就是使用方便,我就想到了用PreferenceActivity,android系统的settings就 ...

  6. JSP(Java Server Pages,即:Java服务器页面

    是一种跨平台的动态网页技术标准,由Sun Microsystems公司倡导.多家公司参与建立. 它在HTML文件中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(* ...

  7. 如何使CSS--better(系列一)

    我们想一下以下问题: 1.什么样子的css代码才是高效的? 2.什么样子的css代码才是便于维护的? 3.什么样子的css才是可扩展的? 带着以下问题咱们简单的说一下css的“性能”问题 虽然我技术不 ...

  8. 如何通过Git命令行把代码提交到github上

    1.http://www.cnblogs.com/leesf456/p/5169765.html   参考博客 背景:最近入手了mac,看见mac上的大神都是在用git命令行推代码,我很羡慕有木有,好 ...

  9. 九度OJ 1252:回文子串 (字符串处理、DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:387 解决:224 题目描述: 输入一个字符串,输出该字符串中对称的子字符串的最大长度. 比如输入字符串"google" ...

  10. centos7 PXE自动安装环境搭建

    原理: 要进行自动安装的主机A,加电启动时以网卡为第一启动设备 1.启动时会向网络广播,找到dhcp服务器B请求分配IP地址信息,服务器B除了给其分配基本的IP信息(ip.netmask.getewa ...