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)
上一篇 2022年1月26日 下午6:00
下一篇 2022年1月26日 下午7:00


相关推荐

  • 10个常见的python面试问题

    10个常见的python面试问题全球有超过 800 万名 Python 开发人员 每天都有成千上万的新学习者加入 Python 社区 残酷的事实是 只有 10 20 的人能够成为一名优秀的开发人员并找到一份好工作 原因是他们无法解决一些高级面试问题 接下来 我将与你分享高频常见的 10 个重要的 Python 问题 1 py 和 pyc 文件有什么区别 py 文件是程序的源代码 pyc 文件是程序的编译字节 Python 编译 py 文件并将其保存为 pyc 文件 然后由 Python 虚拟机执行 在执行主要源代

    2026年3月26日
    3
  • python怎么判断质数和合数_什么是质数和合数以及判断方法介绍

    python怎么判断质数和合数_什么是质数和合数以及判断方法介绍第一 什么是质数和合数的概念什么是质数和合数 属于数学范畴的问题了 在 excel 中如果需要统计 100 以内的质数 首先得明白什么是质数和合数 其概念是什么 简单理解 除 1 以外任意正整数整除则为合数 反之为质数 1 既不是质数也不是合数 2 3 都是质数 除此外如果一个数能被 2 到小于其开方的最大整数整除 则为合数 否则为质数 第二 质数和合数判断了解了什么是质数和合数之后 我们可以在 Excel 中使用公式判

    2026年3月17日
    2
  • C语言getline函数

    C语言getline函数cin getline 字符数组 或字符指针 字符个数 n 终止标志字符 1 用 getline 函数从输入流读字符时 遇到终止标志字符时结束 指针移到该终止标志字符之后 下一个 getline 函数将从该终止标志的下一个字符开始接着读入 2 nbsp 如果在用 cin getline ch 20 从输入流读取数据时 遇到回车键 n 是否结束读取 结论是此时 n 不是结束标志 n 被作

    2026年3月19日
    2
  • flex整合java_Flex和Java 整合

    flex整合java_Flex和Java 整合Flex 和 Java 整合有几种方法 最常见的是 一 Flex java 在一个项目中 二 Flex java 分别在两个项目中 第一种 直接在新建 Flex 项目中选择应用服务器 选择 blazeDS 即可 注意要写上输出文件夹 url endpoint messagebroke amf 写上相对路径即可 第二种 分别新建 Flex java 项目 blazeds war 项目中的 WebConten Web

    2026年3月26日
    2
  • java退出foreach循环_forEach方法如何跳出循环[通俗易懂]

    java退出foreach循环_forEach方法如何跳出循环[通俗易懂]1.for方法跳出循环functiongetItemById(arr,id){varitem=null;for(vari=0;i<arr.length;i++){if(arr[i].id==id){item=arr[i];break;}}returnitem;}2.forEach方法跳出循环functiongetItemById(arr,id)…

    2022年5月24日
    70
  • python android开发_python编制应用程序

    python android开发_python编制应用程序本节目录:1.下载和安装ScriptingLayerforAndroid(SL4A)2.下载和安装Pythonforandroid3.第一个HelloWorld程序1.下载和安装ScriptingLayerforAndroid(SL4A)ScriptingLayerforAndroid(SL4A)是一个开源项目,目标是为android系统提供脚本语言的支持,使用…

    2022年8月12日
    12

发表回复

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

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