摘要:
又一道树形dp,发现其实树形dp长得都挺像的。 阅读全文
摘要:
经典树形dp:问在一棵树上最少删除多少条边可以分离出一个节点数为p的子树。 定义状态: dp[i][j]表示从i为根的子树上分离出一个节点数为j的子树的代价(最少需要删除的边数)。 考虑i节点的每个儿子ii,ii可以选或者不选(切断),然后就转化成了背包问题。 dp[u][j] = min( dp[ 阅读全文
摘要:
定理:二分图的最大匹配=最小点覆盖。思路:将所有行看做点集X,所有列看做点集Y,如果在[i, j]处有小行星,则建立一条从i到j的边,然后求最大匹配即为最小点覆盖数即为答案。 1 #include 2 #include 3 #include 4 using namespace std; 5 ... 阅读全文
摘要:
容易得到:dp[n] = dp[n - 1] * p + dp[n - 2] * ( 1 - p ); (1) 如果在位置i有雷的话,则:dp[i + 1] = dp[i - 1] * ( 1 - p ); 如何求得dp[i]呢? 我们可以解特征方程(1),得到: dp[n] = a * ( p - 阅读全文
摘要:
题意:给出n个数字[1,n],问你可以组成多少种不同的序列,其中每一个序列由几个部分组成,每个部分包含几个数字,每部分内数字无序,部分之间数字有序。每个数字最多使用一次,可以不用。思路:枚举从n个数字中选出i个数字(组合数),再枚举将这i个数字分成j个部分(第二类斯特林数),然后乘上j的全排列。 1... 阅读全文