题意:
给出一棵树,求删除某些边使得树剩下的联通分量对应的定点数乘积最大。
题解:
dp[u][j]表示u为根的子树有j个节点能得到对应分成的联通分量点乘积的最大值。
这题只能用大数做,java写了下大数,各种wa。可能方程错了,用的是背包。
import java.util.*;
import java.math.*;
import java.io.*;
public class Main {
static class TREE
{
public int Ev[]=new int[705<<1];
public int Enext[]=new int[705<<1];
public int head[]=new int[705],tol=0,TreeSize=0;
public BigInteger dp[][]=new BigInteger [705][705];
public void add_edge(int u,int v)
{
Ev[tol]=v;
Enext[tol]=head[u];
head[u]=tol++;
}
public void Init()
{
for(int i=0;i<705;i++)
{
head[i]=-1;
}
tol=0;
for(int i=0;i<705;i++)
{
for(int j=0;j<705;j++)
dp[i][j]=BigInteger.ONE;
}
}
public void dfs(int u,int pre)
{
for(int i=0;i<=TreeSize;i++)
dp[u][i]=BigInteger.valueOf(i);
for(int i=head[u];i!=-1;i=Enext[i])
{
int v=Ev[i];
if(v==pre)continue;
dfs(v,u);
for(int j=TreeSize;j>=1;j--)
{
for(int k=1;k<=j;k++)
{
BigInteger temp=dp[v][k].multiply(dp[u][j-k]);
if(dp[u][j].compareTo(temp)<0)
dp[u][j]=temp;
}
}
}
}
public void output()
{
BigInteger ans=BigInteger.ZERO;
for(int i=1;i<=TreeSize;i++)
if(ans.compareTo(dp[1][i])<0)
ans=dp[1][i];
System.out.println(ans);
}
};
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int u,v;
TREE tree_dp=new TREE();
tree_dp.Init();
tree_dp.TreeSize=cin.nextInt();
for(int i=1;i<tree_dp.TreeSize;i++)
{
u=cin.nextInt();
v=cin.nextInt();
tree_dp.add_edge(u,v);
tree_dp.add_edge(v,u);
}
tree_dp.dfs(1,-1);
tree_dp.output();
}
}