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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java自定义注解Annotation详解[通俗易懂]

    简介开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的作用和自定义注解。列举开发中常见的注解@Override:当重写父类的方法时一般都会在方法上标注上此注解(我们最经常看到的toString()方法上总能看到这货)@Deprecated:用于标记某个方法已经过期,请使用新的方法来替代已经废弃的方法@SuppressWarnings:让编译器或

    2022年4月13日
    66
  • navcat 15 激活码_在线激活[通俗易懂]

    (navcat 15 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S…

    2022年3月26日
    62
  • 白盒测试的测试用例设计方法

    白盒测试的测试用例设计方法一白盒测试的主要技术对简单的程序流程而言,确定程序的路径有多少条可通过:语句覆盖(覆盖率100%);分支(判定)覆盖(覆盖率85%);条件覆盖;分支-条件覆盖;条件组合覆盖;路径覆盖(覆盖率80%)来确定,这也是白盒测试的主要技术。1.1语句覆盖(覆盖率100%)使程序中每个语句至少执行一次1.2分支(判定)覆盖(覆盖率85%)使每个判定的真假分支都至少执行一次1.3条件…

    2022年10月12日
    1
  • linux版本i686,在Ubuntu中’i686’是什么意思? – Ubuntu问答

    linux版本i686,在Ubuntu中’i686’是什么意思? – Ubuntu问答问题描述检查我是使用32位还是64位Ubuntu。我查看了如何检查我是否拥有32位或64位操作系统?,发现此答案为uname-a。如果它显示为i386,它将是32位和amd64,它将是64位,但我得到了这个结果:Linuxmukund-ThinkPad-Edge-E4313.8.0-35-generic#50-UbuntuSMPTueDec301:25:33UTC2013i…

    2022年6月7日
    39
  • 利用远程外网服务器搭建代理服务器[通俗易懂]

    利用远程外网服务器搭建代理服务器[通俗易懂]安装CCProxy官网地址:http://www.ccproxy.com/下载安装即可,软件使用很简单。配置CCProxy配置端口基本上不需要配置什么,只要你将默认的端口改为你的端口号就行,不改可能会被其他软件扫描到。新增账号新增账号支持访问,具体权限可以看说明。选择你的远程服务器特别说明:你的服务器一定要配置安全组,否则端口无法访问。通过服务器中的teln…

    2022年5月1日
    169

发表回复

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

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