摘要: 本题就是从c到a/b再到b/a距离的最大值,显然,a和b分别是树的直径的两个端点,先用两次dfs求出树的直径,再用一次dfs求出每个点到a的距离,最后再用一次dfs求出每个点到距离它较近的a/b的距离,最后以每个节点为c枚举求最大距离即可。 1 #include<bits/stdc++.h> 2 u 阅读全文
posted @ 2022-06-25 16:14 YHXo 阅读(43) 评论(0) 推荐(0)
摘要: 有负边权,所以用树形DP来找树的直径。 1 //树形DP求树的直径 2 #include<bits/stdc++.h> 3 using namespace std; 4 const int N=500005,M=500005; 5 int n,m,tot,ans; 6 int f1[N],f2[N] 阅读全文
posted @ 2022-06-25 15:42 YHXo 阅读(257) 评论(0) 推荐(0)
摘要: 用两次dfs求出树的直径,这两次dfs可以写在一起,当然为了方便理解,这里是分开写的。 1 //两次dfs求树的重心 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 con 阅读全文
posted @ 2022-06-25 15:14 YHXo 阅读(45) 评论(0) 推荐(0)
摘要: 这道题考察了树的重心的性质,所有点到中心的距离之和是最小的,所以我们一遍dfs求出树的重心,在跑一次dfs统计距离之和。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int INF=0x7f7f7f7f; 4 const int 阅读全文
posted @ 2022-06-25 14:44 YHXo 阅读(79) 评论(0) 推荐(0)
摘要: 又是一道模板题...... 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 const int INF=0x7f7f7f7f; 6 const int N=50005; 7 in 阅读全文
posted @ 2022-06-25 14:34 YHXo 阅读(31) 评论(0) 推荐(0)
摘要: 求树的重心的模板题,size[u]维护以u为根的子树大小,f[u]表示去掉u后的最大子树。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 const int INF=0x7f7 阅读全文
posted @ 2022-06-25 14:18 YHXo 阅读(30) 评论(0) 推荐(0)
摘要: 白嫖的一道省选题...... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 typedef long long LL; 6 int dig[15],pos; 7 LL dp[ 阅读全文
posted @ 2022-06-25 11:54 YHXo 阅读(27) 评论(0) 推荐(0)
摘要: dp[i][j]表示以a[i]结尾的长度为j的上升子序列个数。 方程:dp[i][j]=sum(dp[k][j-1]),a[k]<a[i],1<=k<i。 求解目标:sum(dp[k][m]),1<=k<=n。 三层循环枚举的话要超时,观察式子,相当于是统计前缀和,这启示我们可以用到树状数组来优化, 阅读全文
posted @ 2022-06-25 11:41 YHXo 阅读(32) 评论(0) 推荐(0)
摘要: LIS和LCS的结合。 容易写出方程,复杂度是nm2,但我们可以去掉一层没有必要的枚举,用一个变量val记录前一阶段的最优解,这样优化成nm。 1<=k<j,j增加1,k的上界也增加1,就可以考虑用变量优化去掉一层循环。 1 #include<cstdio> 2 #include<cstring> 阅读全文
posted @ 2022-06-25 11:26 YHXo 阅读(24) 评论(0) 推荐(0)
摘要: 将车票的使用情况用二进制表示状态,对其进行转移即可。 但是我一开始写的代码是错误的(注释部分),看似思路是正确的,但是暗藏很大的问题。 枚举S,我们要求解的是dp[S][v],这个是从u转移过来的,不可以写成dp[S|(1<<i)][v]。这也是一次惨痛的教训...... 1 #include<cs 阅读全文
posted @ 2022-06-25 11:12 YHXo 阅读(29) 评论(0) 推荐(0)
摘要: 又是一道有合法性检测的状压题。 dp[i][j][k]表示第i行状态为j,i-1行状态为k时前i行放置的最大数量。 注意22行统计二进制数中1的个数时的巧妙方法。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using 阅读全文
posted @ 2022-06-25 09:57 YHXo 阅读(32) 评论(0) 推荐(0)
摘要: dp[i][j]表示第i行第j个状态时,前i行得到的方案数,该状态可由前一行的状态转移过来。 本题重点在于合法性检测:每一行都用一个二进制数表示,1.二进制数不能有相邻的1;2.要和原地图匹配;3.上下两行不能有冲突。 预处理地图时将0换成1,方便进行2号检测,用位运算&可以实现。 1 #inclu 阅读全文
posted @ 2022-06-25 09:28 YHXo 阅读(34) 评论(0) 推荐(0)
摘要: 题目没有起点限制,且每个节点至少访问1次,最多访问2次,所以用三进制数表示节点的状态(选取情况)。 因为三进制数的每一位是0或1或2,所以预处理z状态S的第j位的数是有必要的。 边界条件:dp[tri[i]][i]=0,表示只访问了i节点时,从i出发最小费用是0。 最后的答案就在所有满足条件的状态中 阅读全文
posted @ 2022-06-25 08:55 YHXo 阅读(32) 评论(0) 推荐(0)
摘要: 本题是经典的Tsp问题的变形,Tsp问题就是要求从起点出发经过每个节点一次再回到起点的距离最小值,本题的区别就是可以经过一个节点不止一次,那么先预处理出任意两点之间的最短距离就行了,因为再多走只会浪费更多的距离。 dp[S][u]表示当前已访问的节点集合为S,从u出发走完剩余节点回到起点的最短距离。 阅读全文
posted @ 2022-06-25 08:24 YHXo 阅读(38) 评论(0) 推荐(0)