- 【题解】树上背包dp
一看到题目的时候想的是贪心(?是可以的然而我太菜了不会?),因为曾经有一道题是拆分序列为2和3的什么什么的。。。= =扯远了
{状态设计} f[i][j] 表示以 i 为根的子树中与 i 的父亲相连的有 j 个节点时,这棵子树的乘积最大值,故最终答案ans=f[1][0];
{转移方程} f[i][j+k]=max(f[i][j]*f[son[i]][k]),其中 j<=size[i], k<=size[son[i]];
struct edge{ int to,nxt;}e[2000];
int n,cnt,s[1000],fi[1000],ans,f[705][705];
void add(int u,int v)
{
e[++cnt].to=v;e[cnt].nxt=fi[u];fi[u]=cnt;
}
void dp(int x,int fa)
{
s[x]=1;f[x][1]=1;
for (int i=fi[x];i;i=e[i].nxt)
if (e[i].to!=fa)
{
dp(e[i].to,x);
for (int j=s[x];j>=0;--j)
for (int k=s[e[i].to];k>=0;--k)