博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1463 树型DP
阅读量:5165 次
发布时间:2019-06-13

本文共 1253 字,大约阅读时间需要 4 分钟。

链接:

题意:

求一棵树的最小点覆盖

题解:

dp[i][0]、dp[i][1]分别表示不在i结点上和在i结点上放置士兵时整个以i结点为根的子树被覆盖用到用到目标的最少数量

状态转移:

对叶子结点,有dp[i][0]=0,dp[i][1]=1  (也是递归的出口)

对非叶子结点,有

dp[i][0]=∑(dp[i][1])

dp[i][1]=∑(min(dp[j][0],dp[j][1]))+1  (j为i的子结点)

代码:

31 int a[MAXN];32 int dp[MAXN][2];33 VI G[MAXN];34 35 void DP(int u) {36     int dp0 = 0, dp1 = 0;37     if (G[u].size() == 0) {38         dp[u][1] = 1;39         dp[u][0] = 0;40         return;41     }42     rep(i, 0, G[u].size()) {43         int v = G[u][i];44         DP(v);45         dp1 += min(dp[v][1], dp[v][0]);46         dp0 += dp[v][1];47     }48     dp[u][1] = dp1 + 1;49     dp[u][0] = dp0;50 }51 52 int main() {53     int n;54     while (cin >> n) {55         memset(dp, 0, sizeof(dp));56         rep(i, 0, MAXN) G[i].clear();57         int root = -1;58         rep(i, 0, n) {59             int u, m;60             scanf("%d:(%d)", &u, &m);61             if (root == -1) root = u;62             while (m--) {63                 int v;64                 scanf("%d", &v);65                 G[u].pb(v);66                 if (v == root) root = u;67             }68         }69         DP(root);70         cout << min(dp[root][0], dp[root][1]) << endl;71     }72     return 0;73 }

 

转载于:https://www.cnblogs.com/baocong/p/6763832.html

你可能感兴趣的文章
TCP/IP协议原理与应用笔记24:网际协议(IP)之 IP协议的简介
查看>>
SAP HANA开发中常见问题- 基于SAP HANA平台的多团队产品研发
查看>>
游戏中的心理学(一):认知失调有前提条件
查看>>
WHAT I READ FOR DEEP-LEARNING
查看>>
【Ruby】Ruby在Windows上的安装
查看>>
Objective C 总结(十一):KVC
查看>>
BZOJ 3747 洛谷 3582 [POI2015]Kinoman
查看>>
vue实战(7):完整开发登录页面(一)
查看>>
Visual Studio自定义模板(二)
查看>>
【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴
查看>>
读《构建之法-软件工程》第四章有感
查看>>
使用 Printf via SWO/SWV 输出调试信息
查看>>
.net 分布式架构之分布式锁实现(转)
查看>>
吴恩达机器学习笔记 —— 3 线性回归回顾
查看>>
Problem E: Automatic Editing
查看>>
SpringBoot 使用 MyBatis 分页插件 PageHelper 进行分页查询
查看>>
《DSP using MATLAB》Problem 6.17
查看>>
微信公众平台开发实战Java版之如何网页授权获取用户基本信息
查看>>
一周TDD小结
查看>>
sizeof与strlen的用法
查看>>