zoukankan      html  css  js  c++  java
  • poj 2486 a apple tree

    题意:n节点的树,从1开始走,总共v步,每个点都有一个价值,求可以获得的最大价值 分析:这个显然可以走回来,那么就加一维表示是否走回祖先 dp[u][i][j]表示从u为根节点的子树,往下走i步,j=0表示不走回来,j=1表示走回来 那么可以得到状态转移方程,不走回来的可能会影响走回来的,如果先算不会来的,那么一个节点在不走回来算一次 在走回来又算一次,所以先算走回来的就可以避免

    dp[u][i][0]=max(dp[u][i][0],dp[u][i-j][1]+dp[v][j-1][0]);

    dp[u][i][0]=max(dp[u][i][0],dp[u][i-j][0]+dp[v][j-2][1]);

    dp[u][i][1]=max(dp[u][i][1],dp[u][i-j][1]+dp[v][j-2][1]); 

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    
    struct node
    {
        int u,v,val,next;
    } tree[505];
    
    int dp[205][405][2],head[205],val[205];
    int len,n,k;
    
    void add(int u,int v)
    {
        tree[len].u = u;
        tree[len].v = v;
        tree[len].next = head[u];
        head[u] = len++;
    }
    
    void dfs(int root,int mark)
    {
        int i,j,t,son;
        for(i = head[root]; i!=-1; i = tree[i].next)
        {
            son = tree[i].v;
            if(son == mark)
                continue;
            dfs(son,root);
            for(j = k; j>=1; j--)
            {
                for(t = 1; t<=j; t++)
                {
                    dp[root][j][0]=max(dp[root][j][0],dp[root][j-t][1]+dp[son][t-1][0]);
                    dp[root][j][0]=max(dp[root][j][0],dp[root][j-t][0]+dp[son][t-2][1]);
                    dp[root][j][1]=max(dp[root][j][1],dp[root][j-t][1]+dp[son][t-2][1]);
                }
            }
        }
    }
    
    int main()
    {
        int i,j,a,b;
        while(~scanf("%d%d",&n,&k))
        {
            memset(dp,0,sizeof(dp));
            memset(head,-1,sizeof(head));
            for(i = 1; i<=n; i++)
            {
                scanf("%d",&val[i]);
                for(j = 0; j<=k; j++)
                    dp[i][j][0] = dp[i][j][1] = val[i];
            }
            len = 0;
            for(i = 1; i<n; i++)
            {
                scanf("%d%d",&a,&b);
                add(a,b);
                add(b,a);
            }
            dfs(1,0);
            printf("%d
    ",max(dp[1][k][0],dp[1][k][1]));
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    Selenium之编辑框操作
    Selenium之勾选框操作
    Selenium之单选框操作
    [复习资料]组合计数学习笔记
    ARC104游记
    [被踩计划] 题解 [省选联考 2020 A 卷] 作业题
    题解 [SEERC2019]Game on a Tree
    [被踩计划] 题解 [NOI2020]美食家
    [被踩计划] 题解 [省选联考 2020 A 卷] 组合数问题
    [被踩计划] 题解 括号树
  • 原文地址:https://www.cnblogs.com/jihe/p/5831418.html
Copyright © 2011-2022 走看看