http://codeforces.com/contest/802/problem/K [题意] 给定一棵树,Heidi从根结点0出发沿着边走,每个结点最多经过k次,求这棵树的最大花费是多少(同一条边走n次花费只算一次) [思路] 对于结点v: 如果在v的某棵子树停下,那么可以“遍历”k棵子树(有的话) 如果还要沿着v返回v的父节点p,那么只能“遍历”k-1棵子树(有的话). 用dp[v][1]表示第一种情况,dp[v][0]表示第二种情况:最后要求的就是dp[0][0]. 1. 对于dp[v]…
Aspirations:没有结果,没有成绩,acm是否有意义?它最大的意义就是让我培养快速理解和应用一个个未知知识点的能力. ———————————————————————————————————————————————— Background:F. Niyaz and Small Degrees http://codeforces.com/contest/1119/problem/F 这道题目是一道高阶的树形DP的题目,我之前并没有涉及到这类题目. 已经有的基础:DP中的01背包. 特点:看到…
Zublicanes and Mumocrates Problem's Link Mean: 给定一个无向图,需要把这个图分成两部分,使得两部分中边数为1的结点数量相等,最少需要去掉多少条边. analyse: 树形dp. dp[cur][i][j]:当cur为i集合的时候 有j个和i同集合的方案 状态转移方程为: dp[cur][i][j+k] = min{dp[to][i^1][j=(叶子个数-d)]+dp[cur][i][k]+1,dp[to][i][j]+dp[cur][i][k]} c…
题目传送门 /* 题意:求一个点为根节点,使得到其他所有点的距离最短,是有向边,反向的距离+1 树形DP:首先假设1为根节点,自下而上计算dp[1](根节点到其他点的距离),然后再从1开始,自上而下计算dp[v], 此时可以从上个节点的信息递推出来 */ #include <cstdio> #include <cstring> #include <cmath> #include <vector> using namespace std; ; const in…
http://codeforces.com/problemset/problem/700/B 题目大意:给你一棵树,给你k个树上的点对.找到k/2个点对,使它在树上的距离最远.问,最大距离是多少? 思路:我们可以把树上的这个分成两个集合,然后两边的点的数目相等.符合这个条件的就是树的重心,所以我们只需要找到树的中心就行啦. //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using namespace std…
Description 题面 题目大意:求从根节点出发,每次随机走一个相邻的点,问走到任意一个叶子节点经过的路径长度的期望(走到就停止) Solution 树上高斯消元,复杂度是 \(O(n)\) 的 设 \(f[x]\) 表示从 \(x\) 走到任意一个叶子节点路径长度的期望 首先列出转移方程: \(f[x]=\frac{f[fa]+dis(x,fa)+\sum f[son]+dis(x,son)}{in[x]}\) 对于叶子节点 \(f[x]=0\) 对于叶子的父亲只有 \(f[x]\) 和…
题目:http://codeforces.com/problemset/problem/161/D 题意:给你一棵树,问你两点之间的距离正好等于k的有多少个 思路:这个题目的内存限制首先大一倍,他有5*1e5个点,k的范围是<=500,首先暴力n^2肯定不行,这个题其实很容易看出是树形dp 首先k的范围只有500,我们可以开一个dp[1e5][500]的dp数组,代表以这个点为上端点的所有情况,然后最后递归到1点处,dp[1][k]就是答案 #include<cstdio> #inclu…
题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsmemory limit per test 512 megabytes 问题描述 A tree is a connected graph that doesn't contain any cycles. The distance between two vertices of a tree is th…
题目:http://codeforces.com/contest/1153/problem/D 题意:给你一棵树,每个节点有一个操作,0代表取子节点中最小的那个值,1代表取子节点中最大的值,叶子节点的话就是自己置一个值,有k个子节点,那么每个子节点的值范围 就是1-k,1-k只能用一次 思路:贪心不好取,我肯定是要排列完才知道当前的值是哪个,但是我可以知道当前节点应该是取子节点中排名第几的那个,从而推出根节点1的排名,然后再输出就行,因为是要从 子节点那里递归上来,所以我们采取树形dp #inc…
洛谷 Codeforces 这题真是妙的很. 通过看题解,终于知道了\(\sum_n f(n)^k​\)这种东西怎么算. update:经过思考,我对这题有了更深的理解,现将更新内容放在原题解下方. 思路 发现\(\sum_S (f(S))^k\)这东西因为有个\(k\)次方,所以特别难算,考虑拆开: \[ x^k=\sum_{i=0}^k {x \choose i} \times i! \times S(k,i) \] 其中\(S(n,m)\)是第二类斯特林数,即\(n\)个元素放进\(m​\…