zoukankan      html  css  js  c++  java
  • HihoCoder

    题目:https://vjudge.net/contest/323605#problem/D

    题意:给你一棵n个点的树,1点出发,然后规定k个点必须去,每个点上有一个权值,要走m个点,问最大权值是多少

    思路:首先k个点因为是必须去的,所以我们先树形DP预处理求出因为这些必须要去的点会影响到其他几个点也必须去,然后我们再树上背包,去考虑m-k个点的最大值,如果当前值之前预处理过了,我们就不加上当前点的权值

    #include<bits/stdc++.h>
    #define maxn 105
    #define mod 1000000007
    using namespace std;
    typedef long long ll;
    int n,m,k;
    int dp[maxn][maxn];
    int d[maxn];
    vector<int> mp[maxn];
    int vis[maxn];
    ll num;
    void dfs(int x,int f){
        for(int i=0;i<mp[x].size();i++){
            int u=mp[x][i];
            if(u==f) continue;
            dfs(u,x);
            for(int t=m;t>=0;t--){
                for(int j=t;j>=0;j--){
                    if(t-j>=0){
                        dp[x][t]=max(dp[x][t],dp[x][t-j]+dp[u][j]);
                    }
                }
            }
        }
        if(vis[x]==0){
            if(x!=0){
                for(int t=m;t>0;t--){
                    dp[x][t]=dp[x][t-1]+d[x];
                }
            }
        }
    }
    int nxt(int x,int f){
        int mx=0;
        for(int i=0;i<mp[x].size();i++){
            int u=mp[x][i];
            if(u==f) continue;
            int e=nxt(u,x);
            mx=max(mx,e);
        }
        if(vis[x]||mx){
            vis[x]=1;
            num+=d[x];
            m--;
            return 1;
        }
    }
    int main(){
        scanf("%d%d%d",&n,&k,&m);
        int x,y;
        for(int i=1;i<=n;i++) scanf("%d",&d[i]);
        for(int i=0;i<k;i++){
            scanf("%d",&x);
            vis[x]=1;
        }
        for(int i=0;i<n-1;i++){
            scanf("%d%d",&x,&y);
            mp[x].push_back(y);
            mp[y].push_back(x);
        } 
        nxt(1,-1);
        if(m<0) printf("-1");
        else if(m==0){
            printf("%lld",num);
        }
        else{
            dfs(1,-1);
            cout<<dp[1][m]+num;
        } 
    }
  • 相关阅读:
    数据结构
    类加载器介绍
    算法复杂度
    PHP代码审计分段讲解(5)
    PHP代码审计分段讲解(4)
    SQLMap使用指北
    PHP代码审计分段讲解(3)
    PHP代码审计分段讲解(1)
    Nmap学习使用指南
    Python Flask后端异步处理(三)
  • 原文地址:https://www.cnblogs.com/Lis-/p/11461584.html
Copyright © 2011-2022 走看看