还是dp,之前的dp都是数组而已。
将包含1号结点的一部分连通的结点进行涂漆(这里的连通指的是这一些涂漆的结点可以互相到达并且不会经过没有涂漆的结点),然后将剩下的结点拆掉。给每个结点都评上了分,希望最后留下来,也就是涂漆了的那些结点的评分之和可以尽可能的高。
求一个包含1的价值最大容量有限的连通集;
dp倒是dp,麻烦的是怎么找到后序遍历,这可不是二叉树。
想了一下觉得和上一道题没什么区别。
dp[i][0]=0;dp[i][1]=v[i];
用vector的形式把根的所有子存下来,
用深搜的方式遍历过去获得dp[i][m]->包括i的m大背包能装多少;
转移方程很明显了,加个循环:
for(int i=0;i<q[loc].size();i++)
for(int j=v;j>=2;j--) //j只能到2 因为必须要保证dp[x][1]不被改变(包含根节点)
for(int k=1;k<j;k++) //取第i子树的k个节点
dp[loc][j]=max(dp[loc][j],dp[loc][j-k]+dp[q[loc][i]][k]);
树规有树规的特性。没有环,dfs不会重复,而且具有明显而又严格的层数关系。
节点不超过5000时可以用邻接矩阵;超过就只能用边。
树规方程通常是叶子节点归纳到根。题目类型如下:
神tm的poj又崩了。。。