题目大意

N个节点构成一棵树形结构,在其中若干个节点上放置士兵,与被放置士兵的节点相连的边会被士兵看守。问需要至少在多少个节点上放置士兵,才能使得N-1条边都被看守。

题目分析

题目描述的结构为树形,且最优化问题,可以考虑使用树形动态规划来解决。将结构按照树根在上,树叶在下的结构进行排列,为了保证无后效性,需要对i节点上有无士兵的情况单独处理,设置状态 dp[i][0] 表示在节点i不放置士兵的情况下,节点i以下的边都被看守所需要放置士兵的最少数目;dp[i][1]表示在节点i放置士兵的情况下,节点i以下的所有边都被看守所需要放置士兵的最少数目。显然有递推关系: 
dp[i][0] = sum{dp[son_of_i][1]} 
dp[i][1] = sum{min{dp[son_of_i][0], dp[son_of_i][1]}}

实现(c++)

#include<stdio.h>
#include<vector>
#include<string.h>
#define min(a, b) a < b? a:b
using namespace std;
vector<int> gGraph[1505];
//使用 vector<int> gGraph[1505], 而不使用 vector<vector<int> >
//是因为题目多组数据,若使用 vector<vector<int> >,则在每组数据都会进行对 外层vecotr的 resize操作,减低效率
int dp[1505][2];
void Travel(int node){
if (gGraph[node].empty()){
dp[node][0] = 0; //node节点不放置士兵的情况下,node节点以下的所有边都被看守所需要的士兵总数
dp[node][1] = 1; //node节点放置士兵的情况下,node节点以下的所有边都被看守所需要的士兵总数
return;
}
dp[node][1] = 1;
for (int i = 0; i < gGraph[node].size(); i++){
Travel(gGraph[node][i]); //由叶子到根进行递推,后序遍历 //node节点不放置士兵的情况下,需要node节点的子节点都放置士兵
dp[node][0] += dp[gGraph[node][i]][1]; //node节点放置士兵,则其子节点可放可不放,选取最小值即可
dp[node][1] += min(dp[gGraph[node][i]][1], dp[gGraph[node][i]][0]); }
} int main(){
int n, root;
while (scanf("%d", &n) != EOF){ for (int i = 0; i < n; i++){
gGraph[i].clear();
} int node, num_adjacent, node_adjacent;
root = -1;
memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; i++){
scanf("%d:(%d)", &node, &num_adjacent);
if (root < 0)
root = node;
for (int j = 0; j < num_adjacent; j++){
scanf("%d", &node_adjacent);
gGraph[node].push_back(node_adjacent);
}
} Travel(root); int result = min(dp[root][0], dp[root][1]);
printf("%d\n", result);
}
return 0;
}

poj_1464 动态规划的更多相关文章

  1. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  2. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  3. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  4. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  5. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  6. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  7. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  8. 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划

    [BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...

  9. POJ 1163 The Triangle(简单动态规划)

    http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

随机推荐

  1. ASP.NET Web Forms 的 DI 應用範例

    跟 ASP.NET MVC 与 Web API 比起来,在 Web Forms 应用程式中使用 Dependency Injection 要来的麻烦些.这里用一个范例来说明如何注入相依物件至 Web ...

  2. Python 爬虫实例(2)—— 爬取今日头条

    # coding:utf-8 import base64 import random, re import sqlite3 import redis, pickle import json, time ...

  3. IIS目录禁止执行权限

    IIS6: IIS7:

  4. Redis(十五):哨兵Sentinel

    Redis哨兵 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你 ...

  5. mount -o remount,rw / (这是个求命的命令)

    当系统无法启动的时候.我们会前进入单用户模式(正常情况下单用户莫式是权限是正常的,只在在无法启动的情况下, 再进入单用户模式,权限才会是只读),这时候没有对文件的修改权限(所有的文件都是只读) 用这条 ...

  6. 使用API Gateway

    http://dockone.io/article/482 [编者的话]本系列的第一篇介绍了微服务架构模式.它讨论了采用微服务的优点和缺点,除了一些复杂的微服务,这种模式还是复杂应用的理想选择. Do ...

  7. UIApplication深入学习

    多时候,我们不需要关心这个类,我们很少继承这个类,偶尔会调用这个类的api来实现一些功能,但是不可否认,这个类是iOS编程中很重要的一个概念.UIApplication的核心作用是提供了iOS程序运行 ...

  8. MySQL 5.7.16 zip包配置

    截止2016/10/16 最新版本Mysql为5.7.16,之前写过一篇APMW搭建的文章(传送门:http://www.cnblogs.com/airoot/p/4131906.html)里面介绍的 ...

  9. DOM方法 getElementsByName()方法

    http://www.imooc.com/code/1583 getElementsByName()方法 返回带有指定名称的节点对象的集合. 语法: document.getElementsByNam ...

  10. nodeJs should+mocha+istanbul 测试 遇到的坑

    .istanbul 和 mocha 结合进行nodejs测试的时候最后执行 istanbul cover _mocha test.sqrt.js的时候报错 如图: 用 ../node_modules/ ...