zoukankan      html  css  js  c++  java
  • (树形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;
    }
    

      

  • 相关阅读:
    二叉树的存储方式以及递归和非递归的三种遍历方式
    java基础04 匿名内部类
    jvm007 jvm知识点总览
    jvm学习006 jvm内存结构分配
    java基础03 位运算符
    java基础02 数据类型转
    jvm005 从jvm的角度谈谈线程的实现
    Arcgis投影变换后图像变深的问题
    win 7 64位如何安装erdas 9.2
    Win7 64bit 成功安装ArcView3.X
  • 原文地址:https://www.cnblogs.com/water-full/p/4509313.html
Copyright © 2011-2022 走看看