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 Web和Java后端开发的学习路线

    Java Web和Java后端开发的学习路线基础:比如计算机系统、算法、编译原理等等Web开发:主要是Web开发相关的内容,包括HTML/CSS/JS(前端页面)、Servlet/JSP(J2EE)以及Mysql(数据库)相关的知识。它们的学习顺序应该是从前到后,因此最先学习的应该是HTML/CSS/JS(前端页面),这部分内容你可以去上面的那个runoob网站上找。J2EE:你需要学习的是Servlet/JSP(J2EE)部分,…

    2022年7月8日
    21
  • python 股票实时数据接口_股票行情实时数据接口

    广告关闭腾讯云11.11云上盛惠,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!sina股票实时数据接口eg:http:hq.sinajs.cnlist=sh600389返回gb2312编码的内容:varhq_str_sh600389=江山股份,15.31,15.74,15.68,16.02,15.16,15.68,15.69,4044916,62900903…

    2022年4月8日
    95
  • git指令集

    git指令集Git是分散式的版本控制系統,從架設、簡易操作、設定,此篇主要是整理基本操作、遠端操作等.註:Git的範圍太廣了,把這篇當作是初學入門就好了.:)注意事項由project/.git/config可知:(若有更多,亦可由此得知)origin(remote)是Repository的版本master(branch)是local端,正在修

    2022年5月7日
    42
  • java属于什么语言_java语言属于什么语言?

    java属于什么语言_java语言属于什么语言?JAVA语言是一种介于解释型语言和编译型语言之间的面向对象语言,属于高级混合型语言。Java代码需要先编译成class,然后交给JVM执行。而JVM在执行class代码时是解释执行的,所以Java不是一门单纯的编译型或解释型语言,它是一门混合型语言。它是集编译型语言和解释型语言的优势于一身,即执行速度较快,只需编写和编译一次,从而逐步发展成了一门高级语言。Java语言是一个支持网络计算的面向对象程…

    2022年7月7日
    19
  • 空间尺度分析图_尺度空间理论

    空间尺度分析图_尺度空间理论SIFT简介整理一下方便阅读,作者写的东西摘自论文,在此感谢xiaowei等的贡献DoG尺度空间构造(Scale-spaceextremadetection)http://blog.csdn.net/xiaowei_cqu/article/details/8067881 关键点搜索与定位(Keypointlocalization)http://blog.csdn.net/xi…

    2022年10月14日
    0
  • jboss版本查询_趣步2.0.7版本下载

    jboss版本查询_趣步2.0.7版本下载JBoss在2006年被RedHat收购。在各种J2EE应用服务器中,JBoss是最受欢迎而且功能最为强大的应用服务器。不过JBoss从8.0开始改名为WildFly,这个新名称在我看来似乎并不朗朗上口。在折腾JavaEE的配置时,新增一个Server,发现JBoss最多只到JBossv5.0,官网上明明已经更新到7.1了,为何这里只显示这么古老的版本,而且我用的是Eclipse

    2022年10月3日
    0

发表回复

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

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