首页 > 代码库 > 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; }
POJ 2486 Apple Tree ( 树型DP )
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。