POJ 2486 Apple Tree ( 树型DP )

POJ 2486 Apple Tree ( 树型DP )

大家好,又见面了,我是全栈君。

#include <iostream>
#include <cstring>
#include <deque>
using namespace std;

#define SIZE 230
#define BACK 1
#define AWAY 0

int DP[SIZE][SIZE][2];
bool visits[SIZE];
int vals[SIZE];
deque< int > tree[SIZE];

int num, steps;


void dfs( int u ){

    visits[u] = true;
    const int len = tree[u].size();

    for( int i = 0; i <= steps; ++i )
        DP[u][i][BACK] = DP[u][i][AWAY] = vals[u];

    for( int i = 0; i < len; ++i ){

        int son = tree[u][i];

        if( visits[son] )
            continue;

        dfs( son );

        for( int s = steps; s >= 0; --s ){
            for( int ss = 0; ss <= s; ++ss ){
                /*
                    从 u 出发,回到 u。须要多走两步 u->son,son->u,
                    分配给 son 子树 ss 步,其它子树 s - ss 步。都返回.
                */
                DP[u][s + 2][BACK] = max( DP[u][s + 2][BACK],
                                          DP[u][s - ss][BACK] + DP[son][ss][BACK] );

                /*
                    不回 u (去 u 的其它子树)。在 son 返回.
                */
                DP[u][s + 2][AWAY] = max( DP[u][s + 2][AWAY],
                                          DP[u][s - ss][AWAY] + DP[son][ss][BACK] );

                /*
                    先遍历 u 的其它子树,回到 u 后,遍历 son 子树,
                    在当前子树 son 不返回,多走一步.
                */
                DP[u][s + 1][AWAY] = max( DP[u][s + 1][AWAY],
                                          DP[u][s - ss][BACK] + DP[son][ss][AWAY] );

            }
        }
    }
}


int main(){

    int u, v;

    while( cin >> num >> steps ){

        memset( DP,     0,     sizeof( DP ) );
        memset( visits, false, sizeof( visits ) );

        for( int i = 1; i <= num; ++i )
            tree[i].clear();

        for( int i = 1; i <= num; ++i )
            cin >> vals[i];

        for( int i = 1; i <= num - 1; ++i ){

            cin >> u >> v;

            tree[u].push_back( v );
            tree[v].push_back( u );

        }

        dfs( 1 );

        cout << max( DP[1][steps][BACK], DP[1][steps][AWAY] ) << endl;

    }

    return 0;

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116052.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一眼看懂map和flatmap的区别

    一眼看懂map和flatmap的区别map的作用很容易理解就是对rdd之中的元素进行逐一进行函数操作映射为另外一个rdd。flatMap的操作是将函数应用于rdd之中的每一个元素,将返回的迭代器的所有内容构成新的rdd。通常用来切分单词。Spark中map函数会对每一条输入进行指定的操作,然后为每一条输入返回一个对象;而flatMap函数则是两个操作的集合——正是“先映射后扁平化”:操作1:同map函数一样:对每一条输入进…

    2022年5月4日
    63
  • 干货 | 一文概览主要语义分割网络,FCN、UNet、SegNet、DeepLab 等等等等应有尽有[通俗易懂]

    干货 | 一文概览主要语义分割网络,FCN、UNet、SegNet、DeepLab 等等等等应有尽有[通俗易懂]原文地址:https://meetshah1995.github.io/semantic-segmentation/deep-learning/pytorch/visdom/2017/06/01/semantic-segmentation-over-the-years.html介绍图像的语义分割是将输入图像中的每个像素分配一个语义类别,以得到像素化的密集分类。虽然自2007年以来,…

    2022年8月21日
    36
  • 熊猫烧香病毒简析[通俗易懂]

    熊猫烧香病毒简析[通俗易懂]熊猫烧香从2007年1月肆虐网络到现在。已经过了查不多4个年头了。病毒的作者李俊现在也从监狱里被放了出来。在当时熊猫烧香确实给大家一个意外,它采用了一种新的方式对计算机的程序和系统造成了很严重的破坏。 其实我的这篇文章也不叫什么分析,只是说简单的简析。我只是简单的对病毒的机

    2025年7月9日
    4
  • Java资源大全中文版

    Java资源大全中文版首先为自己打个广告,我目前在某互联网公司做架构师,已经有5年经验,每天都会写架构师系列的文章,感兴趣的朋友可以关注我和我一起探讨,关注我,免费分享Java基础教程,以及进阶的高级Java架构师教程,全部免费送古董级工具这些工具伴随着Java一起出现,在各自辉煌之后还在一直使用。ApacheAnt:基于XML的构建管理工具。cglib:字节码生成库。GlassFish:应用服务器,由Orac…

    2022年7月8日
    34
  • Java——迭代器iterator详解

    Java——迭代器iterator详解一 Iterator 的 API nbsp nbsp nbsp 关于 Iterator 主要有三个方法 hasNext next remove nbsp nbsp nbsp hasNext 没有指针下移操作 只是判断是否存在下一个元素 nbsp nbsp nbsp next 指针下移 返回该指针所指向的元素 nbsp nbsp nbsp remove 删除当前指针所指向的元素 一般和 next 方法一起用 这时候的作用就是删除 next 方法返回的元素 nbsp 二

    2025年10月6日
    4
  • Response.ContentType 详细列表

    Response.ContentType 详细列表Response.ContentType详细列表不同的ContentType会影响客户端所看到的效果.默认的ContentType为text/html也就是网页格式.代码如:显示的为网页,而则会显示html原代码.以下为一些常用的ContentTypeGIFimagesJPEG

    2022年7月19日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号