题目链接

CF23 E. Tree

题解

CF竟让卡常QAQ

dp+高精度

dp[x][j]表示以x为根的子树,x所属的联通块大小为j,的最大乘积(不带j这块

最后f[x]维护以x为根的子树的最大答案

有点卡内存...高精压了4位

看了题解,了解到,其实这个dp的复杂度其实是O(n^2)

每次转移是复杂度是x之前的子树的sz * 当前子树的sz

相当于之前子树所有点和当前子树的点组成的点对数

而每个点对只会在lca处被计算一次

所以复杂度O(n^2)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' ||c > '9')c = getchar();
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar();
return x * f;
} const int L = 10000;
const int maxn = 701;
const int maxlen = 61;
struct Bignum{
int num[maxlen];
int len;
Bignum () {memset(num,0,sizeof num); len = 0; }
void print() {
for(int i = len;i;-- i)
if(i != len) {
if(num[i - 1] < L / 10) {
printf("0");
if(num[i - 1] < L / 100) {
printf("0");
if(num[i - 1] < L / 1000) printf("0");
}
}
printf("%d",num[i - 1]);
} else printf("%d",num[i - 1]);
puts("");
}
} dp[maxn][maxn],Max[maxn]; Bignum operator * (Bignum a,Bignum b) {
int len = 0;
Bignum ret;
for(int i = 0;i < a.len;i ++) for(int j = 0;j < b.len;j ++) {
ret.num[i + j] += a.num[i] * b.num[j];
if(ret.num[i + j] >= L) {
ret.num[i + j + 1] += ret.num[i + j] / L;
ret.num[i + j] %= L;
}
}
len = a.len + b.len;
while(ret.num[len-1] == 0 && len > 1) len --;
ret.len = len;
return ret;
}
Bignum operator / (Bignum a,int b) {
int len = a.len;
Bignum ret;
if(!b) return ret;
for(int i = 0;i < len;i ++) {
ret.num[i] += a.num[i]* b;
if(ret.num[i] >= L) {
ret.num[i+1] += ret.num[i] / L;
ret.num[i] %= L;
}
}
while(ret.num[len] > 0) ret.num[len+1] = ret.num[len] / L, ret.num[len ++] %= L;
ret.len = len;
return ret;
}
Bignum max(Bignum a,Bignum b) {
if(a.len < b.len) return b;
if(a.len > b.len) return a;
for(int i = a.len-1;i >= 0;i --) {
if(a.num[i] < b.num[i]) return b;
if(a.num[i] > b.num[i]) return a;
}
return b;
} //-------------------------------
struct node {
int v,next;
} edge[maxn << 1];
int head[maxn],num = 0;
inline void add_edge(int u,int v) {
edge[++ num].v = v;edge[num].next = head[u];head[u] = num;
} int n;
int siz[maxn];
void dfs(int x,int fa) {
siz[x] = 1;
dp[x][1].len = 1; dp[x][1].num[0] = 1;
for(int i = head[x];i;i = edge[i].next) {
int v = edge[i].v;
if(v == fa) continue;
dfs(v,x);
siz[x] += siz[v];
}
for(int i = head[x];i;i = edge[i].next) {
int v = edge[i].v;
if(v == fa) continue;
for(int i = siz[x];i;-- i) {
if(dp[x][i].len)
for(int j = 1;j <= siz[v];++ j)
if(dp[v][j].len) dp[x][i + j] = max(dp[x][i + j],dp[x][i] * dp[v][j]);
dp[x][i] = dp[x][i] * Max[v];
}
}
for(int i = siz[x];i ;-- i) Max[x] = max(Max[x],dp[x][i] / i);
} int main() {
n = read();
for(int i = 1,u,v;i < n;++ i) {
u = read();v = read();
add_edge(u,v); add_edge(v,u);
}
dfs(1,0);
Max[1].print();

CF23 E. Tree 树形dp+高精度的更多相关文章

  1. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...

  2. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

    题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: ...

  3. CF 461B Appleman and Tree 树形DP

    Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...

  4. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  5. hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

    /** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...

  6. 5.10 省选模拟赛 tree 树形dp 逆元

    LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...

  7. Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】

    题意:给了一棵树以及每个节点的颜色,1代表黑,0代表白,求将这棵树拆成k棵树,使得每棵树恰好有一个黑色节点的方法数 解法:树形DP问题.定义: dp[u][0]表示以u为根的子树对父亲的贡献为0 dp ...

  8. codeforces Round #263(div2) D. Appleman and Tree 树形dp

    题意: 给出一棵树,每个节点都被标记了黑或白色,要求把这棵树的其中k条变切换,划分成k+1棵子树,每颗子树必须有1个黑色节点,求有多少种划分方法. 题解: 树形dp dp[x][0]表示是以x为根的树 ...

  9. POJ 2486 Apple Tree(树形DP)

    题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...

随机推荐

  1. 【DS】排序算法之插入排序(Insertion Sort)

    一.算法思想 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下:1)从第一个元素开始,该元素可以认为已经被排序2)取出下一个元素,在已经排序的元素序列中从后向前扫描3)如果该元素 ...

  2. POJ 3252 Round Number(数位DP)

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6983   Accepted: 2384 Des ...

  3. 《Linux命令行与shell脚本编程大全》第十一章 构建基本脚本

    11.1使用多个命令 $date;who   //  命令列表,加入分号就可以,这样会依次执行.参见5.2.1节 注意区分$(date;who),这个是进程列表,会生成一个子shell来执行 Shel ...

  4. javascript完美拖拽的实现

    直接上代码: HTML代码: <!DOCTYPE HTML> <html lang="en-US"> <head> <meta chars ...

  5. UVALive 6467 Strahler Order

    > 题目链接 题意:给定一个有向图,顶点代表水池,入度为零的定点代表水源,等级是1,他们延河道(有向边)冲撞,对于普通的水池来说,题目给定判断它等级的两个准则,问出度为零的那个点的等级是多少. ...

  6. django+mysql安装和设置

    之前我们已经用sqlite建立了第一个web app.今天来学习如何在django中使用MySQL. 首先需要安装MySQL,到官网下载安装包:https://dev.mysql.com/downlo ...

  7. word技巧

    1.插入注解(脚注和尾注) 2.复制的图片显示不全怎么办? 横向显示,或者图片另存为然后保存为PPT 3.word修订标记的添加和删除(最终版) 4.word中表格样式调整 5.修改标题的样式和标题的 ...

  8. perl6 中将 字符串 转成十六进制

    say Blob.new('abcde'.encode('utf8')).unpack("H*"); say '0x'~'abcde'.encode('utf8').unpack( ...

  9. python3.3中print换行

    python  3.3版本中的print默认有个换行的操作 如: for i in range(5): print(i) 结果为: 01234 如果不想换行,需要用到print函数的end参数,pri ...

  10. jquery模型(外壳实现)

    详细解释: 1.现在传入的参数是window,document,可以知道是它俩引用 2. 3. 4.每次调用jquery方法,都会创建一个实例,但是内存并没有暴涨,原因是:jquery里面new 的这 ...