题目链接

  我貌似又做了一道高精题呢(笑)

  这题的DP方程很好想,设f[i][j]表示i为根的子树,i所在联通块大小为j的最大值,然后乱搞

  但是要高精,那么搞是得要高精除的

  所以考虑f[i][j]是除以j后的最大值,就可以只写高精乘了

  不过卡常,下面代码只能得95分

// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define maxl 120
#define maxn 702
#define check(x) if(x==0) x=++tot;
using namespace std; inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct BigInteger{
int s[maxl],len;
BigInteger(){len=;memset(s,,sizeof(s));}
BigInteger operator =(const char *c){
len=;
for(int i=strlen(c+);i;--i) s[++len]=c[i]-'';
return *this;
}
BigInteger operator =(const int num){
char c[maxl];
sprintf(c+,"%d",num);
(*this)=c;
return *this;
}
BigInteger operator *(BigInteger a){
BigInteger ans;
ans.len=len+a.len;
for(int i=;i<=len;++i)
for(register int j=;j<=a.len;++j)
ans.s[i+j-]+=s[i]*a.s[j];
int g=;
for(int i=;i<=(len+a.len)||g;++i){
ans.s[i]+=g;
g=ans.s[i]/;
ans.s[i]%=;
if(ans.len<i) ans.len=i;
}
while(ans.len&&ans.s[ans.len]==) ans.len--;
return ans;
}
BigInteger operator *(const int a){
BigInteger ans=(*this);
int g=,lim=ans.len;
for(int i=;(i<=lim)||g;++i){
ans.s[i]=ans.s[i]*a+g;
g=ans.s[i]/;
ans.s[i]%=;
if(i>ans.len) ans.len=i;
}
while(ans.len&&ans.s[ans.len]==) ans.len--;
return ans;
}
bool operator <(const BigInteger a)const{
if(len!=a.len) return len<a.len;
for(int i=len;i;--i)
if(s[i]!=a.s[i]) return s[i]<a.s[i];
return ;
}
}; inline void print(BigInteger a){
if(a.len==) putchar('');
for(int i=a.len;i;--i) putchar(a.s[i]+'');
} BigInteger f[maxn*];
int tot;
int size[maxn];
int pos[maxn][maxn];
BigInteger ans; struct Edge{
int next,to;
}edge[maxn*];
int head[maxn],num;
inline void add(int from,int to){
edge[++num]=(Edge){head[from],to};
head[from]=num;
} void dfs(int x,int fa){
check(pos[x][]); check(pos[x][]);
f[pos[x][]]=;f[pos[x][]]=; size[x]=;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==fa) continue;
dfs(to,x);
size[x]+=size[to];
for(int j=size[x];j>=;--j){
check(pos[x][j]);
for(int k=min(j,size[x]-size[to]);k>=min(,size[x]-size[to]);--k)
if(f[pos[x][j]]<f[pos[to][j-k]]*f[pos[x][k]]){
f[pos[x][j]]=f[pos[to][j-k]]*f[pos[x][k]];
}
}
}
for(int j=;j<=size[x];++j){
if(f[pos[x][]]<f[pos[x][j]]*j){
f[pos[x][]]=f[pos[x][j]]*j;
if(ans<f[pos[x][]]) ans=f[pos[x][]];
}
}
} int main(){
int n=read();
for(int i=;i<n;++i){
int x=read(),y=read();
add(x,y);
add(y,x);
}
dfs(,);
print(ans);
}

【Luogu】P1411树(树形高精DP)的更多相关文章

  1. 洛谷 P1411 树 (树形dp)

    大意: 给定树, 求删除一些边, 使得连通块大小的乘积最大 设$dp_{i,j}$表示只考虑点$i$的子树, $i$所在连通块大小为$j$的最大值. 转移的时候不计算$i$所在连通块的贡献, 留到最后 ...

  2. 与高精死杠的几天——记两道简单的高精dp

    (同样也是noip往年的题 1​.矩阵取数游戏 题目链接[Luogu P1005 矩阵取数游戏] \(\mathcal{SOLUTION}:\) 通过对题目条件的分析,我们可以发现,每一行取数对答案的 ...

  3. [CEOI2007]树的匹配Treasury(树形DP+高精)

    题意 给一棵树,你可以匹配有边相连的两个点,问你这棵树的最大匹配时多少,并且计算出有多少种最大匹配. N≤1000,其中40%的数据答案不超过 108 题解 显然的树形DP+高精. 这题是作为考试题考 ...

  4. BZOJ1089 [SCOI2003]严格n元树 【dp + 高精】

    Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严 ...

  5. bzoj 1089: [SCOI2003]严格n元树【dp+高精】

    设f[i]为深度为i的n元树数目,s为f的前缀和 s[i]=s[i-1]^n+1,就是增加一个根,然后在下面挂n个子树,每个子树都有s[i-1]种 写个高精就行了,好久没写WA了好几次-- #incl ...

  6. 【BZOJ-3572】世界树 虚树 + 树形DP

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1084  Solved: 611[Submit][Status ...

  7. 【BZOJ-2286】消耗战 虚树 + 树形DP

    2286: [Sdoi2011消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2120  Solved: 752[Submit][Status] ...

  8. BZOJ.1210.[HNOI2004]邮递员(插头DP Hash 高精)

    BZOJ 洛谷 http://www.cnblogs.com/LadyLex/p/7326874.html 插头DP.\(m+1\)个插头的状态需要用三进制表示:\(0\)表示无插头,\(1\)表示是 ...

  9. [P1005][NOIP2007] 矩阵取数游戏 (DP+高精)

    我不会高精…… 也不会DP…… 这道题即考高精又考DP…… 我要死了 给一个不是高精的代码(当然不能满分) #include<cstdio> #include<iostream> ...

随机推荐

  1. [学习笔记] Markdown语法备忘

    Markdown语法总结 标题 # 这是一级标题 ## 这是二级标题 ### 这是三级标题 #### 这是四级标题 ##### 这是五级标题 ###### 这是六级标题 注意#后面要加空格 字体 ** ...

  2. Hbase 完全分布式 高可用 集群搭建

    1.准备 Hadoop 版本:2.7.7 ZooKeeper 版本:3.4.14 Hbase 版本:2.0.5 四台主机: s0, s1, s2, s3 搭建目标如下: HMaster:s0,s1(备 ...

  3. 《剑指offer》39题—数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  4. bootstrap 翻页的状态

    翻页的状态 下面的实例演示了上表中所讨论的 class .disabled 的用法: <!DOCTYPE html><html><head><meta htt ...

  5. cocos2dx 通过jni调用安卓底层方法

    cocos2dx通过封装JniHelper类来调用安卓api底层函数,该文件在cocos/platform/android/jni/JniHelper.h,使用方法如下: 打开eclipse,导入co ...

  6. js函数节流和函数防抖

    概念解释 函数节流: 频繁触发,但只在特定的时间内才执行一次代码 函数防抖: 频繁触发,但只在特定的时间内没有触发执行条件才执行一次代码 函数节流 函数节流应用的实际场景,多数在监听页面元素滚动事件的 ...

  7. 201621123080 《Java程序设计》第10周学习总结

    201621123080 <Java程序设计>第10周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 ...

  8. 标准C++(3)重载

    一.函数的重载 c++中同一作用域下能够定义同名的函数(这就叫重载),但必须满足如下要求: 1.函数的参数列表必须不同,可以使参数数量不同,也可以使参数的类型不同,甚至是参数的顺序不同. 2.函数的返 ...

  9. 代理工具--fiddle

    正则匹配 1)前缀为“EXACT:”表示完全匹配:只有match=rules时,才匹配 2)无前缀表示基本搜索,表示搜索到字符串就匹配:只要match中包含了rules的字符串,即可 3)前缀为“NO ...

  10. laravel连接数据库提示mysql_connect() :Connection refused...

    在.env配置文件中填写了正确的数据库连接配置的情况下连接还是出错了,明显提示的不是密码错误,那就看看端口吧, DB_HOST=127.0.0.1 DB_PORT= DB_DATABASE=test ...