题目链接

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. xgboost入门与实战(原理篇)

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  2. Python常用模块-时间模块(time&datetime)

    Python常用模块-时间模块(time & datetime) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.初始time模块 #!/usr/bin/env pyth ...

  3. Spring Boot 源码分析 数据源 + Mybatis 配置

    公司今年开始使用 Spring Boot 开发,当然使用 Spring Boot 也是大势所趋,尤其是现在微服务的趋向,当然是选择基于Spring Boot 的 Spring Cloud.(所谓的 S ...

  4. AngularJs-$parsers自我理解-解析

    $parsers 首先先了解下它具体的作用,当用户与控制器进行交互的时候.ngModelController中的$setViewValue()方法就会被调用,$parsers的数组中函数就会以流水线的 ...

  5. json转化数组

    //json格式数据 $data = '[{ "F_ModuleId": "1", "F_ParentId": "0", ...

  6. 矩阵乘法优化DP

    本文讲一下一些基本的矩阵优化DP的方法技巧. 定义三个矩阵A,B,C,其中行和列分别为$m\times n,n \times p,m\times p$,(其中行是从上往下数的,列是从左往右数的) $C ...

  7. CodeForces 1059B

    Description Student Andrey has been skipping physical education lessons for the whole term, and now ...

  8. HDU 2680 Choose the best route 最短路问题

    题目描述:Kiki想去他的一个朋友家,他的朋友家包括所有的公交站点一共有n 个,一共有m条线路,线路都是单向的,然后Kiki可以在他附近的几个公交站乘车,求最短的路径长度是多少. 解题报告:这道题的特 ...

  9. FinalShell 推荐

    FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求. 用户QQ群 342045988 Windows版下载地址:http:/ ...

  10. CF232C Doe Graphs

    传送门 Solution:  (不理解时对着图研究一下就清楚啦!!!) sm[i]为|D(i)|  (x,y,n)为x,y在D(n)中的最短路 已知sm[i-1]+1为D(i)的割点 于是x-y的最短 ...