poj 1192 树形dp
2014-02-23 10:38
246 查看
好久没刷过树形dp了,都快忘记了
dp【n】【0】表示不含有节点n时的最大权值和
dp【n】【1】表示含有节点n时的最大权值和
AC代码如下:
dp【n】【0】表示不含有节点n时的最大权值和
dp【n】【1】表示含有节点n时的最大权值和
AC代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define MAX 0x3f3f3f3f struct Edge{ int to, next; }; struct Point{ int x, y; int value; }; int head[1100], tot; Edge edge[2200]; Point point[1100]; int N; int dp[1100][2]; bool mark[1100]; int add_adge( int a, int b ){ edge[tot].to = b; edge[tot].next = head[a]; head[a] = tot++; edge[tot].to = a; edge[tot].next = head[b]; head[b] = tot++; return 0; } int DFS( int pre, int pos ){ mark[pos] = true; dp[pos][0] = 0; for( int i = head[pos]; i != -1; i = edge[i].next ){ int to = edge[i].to; if( to == pre ){ continue; } if( !mark[to] ){ DFS( pos, to ); } dp[pos][0] = max( dp[pos][0], dp[to][0] ); dp[pos][0] = max( dp[pos][0], dp[to][1] ); } dp[pos][1] = point[pos].value; for( int i = head[pos]; i != -1; i = edge[i].next ){ int to = edge[i].to; if( to == pre ){ continue; } if( !mark[to] ){ DFS( pos, to ); } dp[pos][1] += max( 0, dp[to][1] ); } return 0; } int main() { while( scanf( "%d", &N ) != EOF ){ tot = 0; memset( head, -1, sizeof( head ) ); for( int i = 0; i < N; i++ ){ cin >> point[i].x >> point[i].y >> point[i].value; } for( int i = 0; i < N; i++ ){ for( int j = i + 1; j < N; j++ ){ if( abs( point[i].x - point[j].x ) + abs( point[i].y - point[j].y ) == 1 ){ add_adge( i, j ); } } } for( int i = 0; i < N; i++ ){ for( int j = 0; j < 2; j++ ){ dp[i][j] = -MAX; } } memset( mark, false, sizeof( mark ) ); DFS( -1, 0 ); int ans = -MAX; for( int i = 0; i < N; i++ ){ ans = max( ans, dp[i][1] ); ans = max( ans, dp[i][0] ); } cout << ans << endl; } return 0; }
相关文章推荐
- 日记 nand驱动移植简介
- N黑快围观:690战术核显卡现身
- 黑马程序员_加强12_枚举 1.5的性特性
- wp应用开发吸金能力不亚于Iso
- JSP防盗链小结
- Java 7之基础 - 强引用、弱引用、软引用、虚引用
- 设计模式(23)——访问者模式与双分派
- virtualBox启动虚拟机报“The VirtualBox kernel driver is not accessible to the current user”错误
- 设计模式(21)——访问者模式
- 设计模式(20)——享元模式
- Windows.old文件夹删除不了的解决方法
- 五位数的QQ网上要价585000
- REST WebServices学习
- C/C++中获取数组的长度
- 设计模式(19)——状态模式
- 设计模式(18)——备忘录模式
- 微信“广点通”威力如何?
- 《Java并发编程实战》笔记Ⅰ
- JS闭包的理解(转载)
- 设计模式(16)——中介者模式