poj 3342 树形dp
2015-07-20 10:51
393 查看
还是简单的树形dp,不过要判断最优解是否有多种。
#include <iostream> #include <cstring> #include <cstdio> #include <map> using namespace std; const int N = 201; int head ; int dp [2]; bool flag [2]; int n, e, cnt; map<string, int> mp; struct Edge { int v, next; } edge ; void addEdge( int u, int v ) { edge[e].v = v; edge[e].next = head[u]; head[u] = e++; } void dfs( int u ) { dp[u][0] = 0, dp[u][1] = 1; for ( int i = head[u]; i != -1; i = edge[i].next ) { int v = edge[i].v; dfs(v); dp[u][1] += dp[v][0]; if ( flag[v][0] ) { flag[u][1] = true; } if ( dp[v][0] > dp[v][1] ) { dp[u][0] += dp[v][0]; if ( flag[v][0] ) { flag[u][0] = true; } } else if ( dp[v][0] < dp[v][1] ) { dp[u][0] += dp[v][1]; if ( flag[v][1] ) { flag[u][0] = true; } } else { dp[u][0] += dp[v][0]; flag[u][0] = true; } } } char str1 , str2 ; int main () { while ( scanf("%d", &n), n ) { e = 0; cnt = 1; memset( head, -1, sizeof(head) ); mp.clear(); scanf("%s", str1); mp[str1] = cnt++; for ( int i = 1; i < n; i++ ) { scanf("%s%s", str1, str2); if ( mp.count(str1) == 0 ) { mp[str1] = cnt++; } if ( mp.count(str2) == 0 ) { mp[str2] = cnt++; } addEdge( mp[str2], mp[str1] ); } memset( flag, false, sizeof(flag) ); dfs(1); if ( dp[1][0] > dp[1][1] ) { printf("%d", dp[1][0]); if ( !flag[1][0] ) printf(" Yes\n"); else printf(" No\n"); } else if ( dp[1][1] > dp[1][0] ) { printf("%d", dp[1][1]); if ( !flag[1][1] ) printf(" Yes\n"); else printf(" No\n"); } else { printf("%d No\n", dp[1][0]); } } return 0; }
相关文章推荐
- html 学习总览
- 《你最美》换发型应用项目源码
- linux mint安装搜狗输入法
- poj3093
- Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新
- 【Java基础第一弹】Java序列化基础篇
- poj3093 分类: poj 2015-07-20 10:50 18人阅读 评论(0) 收藏
- (大数据工程师学习路径)第三步 Git Community Book----Git基本用法(上)
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- 辨析 singleton 和 prototype
- 在Extjs中动态增加控件
- spring aop事务配置,事务回滚
- OC的单例模式的实现
- Spring bean加载顺序 depends-on
- 内建变量
- 设计模式_中介者模式
- 【sqlserver】如何添加外键
- C++知识点总结(5)
- C++知识点总结(5)
- 优秀博客地址