zoukankan      html  css  js  c++  java
  • Codeforces 23E Tree(树型DP)

    题目链接 Tree

    $dp[x][i]$表示以x为根的子树中x所属的连通快大小为i的时候 答案最大值

    用$dp[x][j]$ * $dp[y][k]$ 来更新$dp[x][j + k]$。

    (听高手说这类题的套路其实都差不多)

    因为这题输出数据会很大所以用Java……

    QAQ

    import java.util.*;
    import java.io.*;
    import java.math.*;
    
    public class Main{
        static final int maxn = 710;
        static BigInteger dp[][] = new BigInteger[maxn][maxn];
        static int v[][] = new int[maxn][maxn];
        static int sum[] = new int[maxn];
        static int n;
        
        static void dfs(int x, int pre){ int y;
            sum[x] = 1;
            for(int i = 0; i <= n; ++i) dp[x][i] = BigInteger.ONE;
            for(int i = 1; i <= v[x][0]; ++i){
                y = v[x][i];
                if(y == pre) continue;
                dfs(y, x);
                for(int j = sum[x]; j >= 0; --j)
                    for(int k = sum[y]; k >= 0; --k){
                        dp[x][j + k] = dp[x][j + k].max(dp[x][j].multiply(dp[y][k]));
                }
                sum[x] += sum[y];
            }
            for(int i = 1; i <= sum[x]; ++i) dp[x][0] = dp[x][0].max(dp[x][i].multiply(BigInteger.valueOf(i)));
        }
        
        public static void main(String[] args){
            Scanner in = new Scanner(System.in);
            n = in.nextInt();
            for(int i = 1; i <= n; ++i){
                v[i][0] = 0;
            }
            for(int i = 1; i < n; ++i){
                int x = in.nextInt();
                int y = in.nextInt();
                v[x][++v[x][0]] = y;
                v[y][++v[y][0]] = x;
            }
            dfs(1, 0);
            System.out.println(dp[1][0]);
        }
    
    }
    
  • 相关阅读:
    firefox配置
    安装gstreamer开发环境
    linux下批量替换文件内容(转)
    iptables详细教程:基础、架构、清空规则、追加规则、应用实例(转)
    iptables 使用
    如何用iptables实现NAT(转)
    Python 练习题
    Python unittest 参数化
    Python Logging模块
    Python 多进程
  • 原文地址:https://www.cnblogs.com/cxhscst2/p/6798457.html
Copyright © 2011-2022 走看看