• (树形DP) zoj 3201


    Tree of Tree

    Time Limit: 1 Second      Memory Limit: 32768 KB

    You're given a tree with weights of each node, you need to find the maximum subtree of specified size of this tree.

    Tree Definition 
    A tree is a connected graph which contains no cycles.

    Input

    There are several test cases in the input.

    The first line of each case are two integers N(1 <= N <= 100), K(1 <= K <= N), where N is the number of nodes of this tree, and K is the subtree's size, followed by a line with N nonnegative integers, where the k-th integer indicates the weight of k-th node. The following N - 1 lines describe the tree, each line are two integers which means there is an edge between these two nodes. All indices above are zero-base and it is guaranteed that the description of the tree is correct.

    Output

    One line with a single integer for each case, which is the total weights of the maximum subtree.

    Sample Input

    3 1
    10 20 30
    0 1
    0 2
    3 2
    10 20 30
    0 1
    0 2
    

    Sample Output

    30
    40
    

    题意:选K个节点的子树的最大值

    dp[i][j]以i为父亲节点的选j个节点的最大值

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<vector>
    using namespace std;
    int n,k,dp[105][105],val[105];
    vector<int> e[105];
    void dfs(int u,int father)
    {
        dp[u][1]=val[u];
        for(int i=0;i<e[u].size();i++)
        {
            int v=e[u][i];
            if(v==father)
                continue;
            dfs(v,u);
            for(int j=k;j>=1;j--)
            {
                for(int t=1;t<=j;t++)
                    dp[u][j]=max(dp[u][j],dp[u][t]+dp[v][j-t]);
            }
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&k)!=EOF)
        {
            for(int i=0;i<n;i++)
            {
                e[i].clear();
                for(int j=0;j<n;j++)
                    dp[i][j]=0;
            }
            for(int i=0;i<n;i++)
                scanf("%d",&val[i]);
            for(int i=1;i<n;i++)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                e[x].push_back(y);
                e[y].push_back(x);
            }
            dfs(0,-1);
            int ans=0;
            for(int i=0;i<n;i++)
                ans=max(ans,dp[i][k]);
            printf("%d
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    c++对象的生命周期
    VS2010在工具栏上创建查找组合框,即:CMFCToolBar中加入CMFCToolBarComboBoxButton
    VS2010 MFC多文档中的工具栏CMFCToolBar停靠的问题
    Nginx使用部署方案
    [软件测试] 软件测试基础问答
    OAI 安装好之后网络配置。
    Ubuntu 18.04 安装OAI (EPC+eNB+UE)
    build.sh安装依赖包
    [Linux简单操作] 查询设备相关信息
    [计算机基础] 基础问答
  • 原文地址:https://www.cnblogs.com/water-full/p/4509313.html
Copyright © 2020-2023  润新知