博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Strategic Game(树形DP)
阅读量:4873 次
发布时间:2019-06-11

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

目录

Strategic Game(树形DP)

题目

Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast enough and then he is very sad. Now he has the following problem. He must defend a medieval city, the roads of which form a tree. He has to put the minimum number of soldiers on the nodes so that they can observe all the edges. Can you help him?

Your program should find the minimum number of soldiers that Bob has to put for a given tree.

The input file contains several data sets in text format. Each data set represents a tree with the following description:

the number of nodes

the description of each node in the following format

node_identifier:(number_of_roads) node_identifier1 node_identifier2 ... node_identifier or node_identifier:(0)

The node identifiers are integer numbers between 0 and n-1, for n nodes (0 < n <= 1500). Every edge appears only once in the input data.

For example for the tree:

375f7d616782d8d9876a06e39b58fc3c?v=1564250436

the solution is one soldier ( at the node 1).

The output should be printed on the standard output. For each given input data set, print one integer number in a single line that gives the result (the minimum number of soldiers). An example is given in the following table:

Input
4
0:(1) 1
1:(2) 2 3
2:(0)
3:(0)
5
3:(3) 1 4 2
1:(1) 0
2:(0)
0:(0)
4:(0)
Output
1
2
Sample Input
4
0:(1) 1
1:(2) 2 3
2:(0)
3:(0)
5
3:(3) 1 4 2
1:(1) 0
2:(0)
0:(0)
4:(0)
Sample Output
1
2

题意

给定一棵树,树的每一个边至少要有一个点,求最少要多少点。

思路

简单的树形dp

  • 因为要从自己点推父节点,所以可以使用递归。
  • 父节点不放的话,子节点必须放。父节点放的话子节点可放可不放。
    故得到:
    dp[u][0] += dp[v][1];
    dp[u][1] += min(dp[v][0], dp[v][1]);

题解

//简单的树形dp#include 
#include
#include
#include
#define N 1805using namespace std;vector
eg[N];int dp[N][N];int parent[N];int n;int dfs(int u){ dp[u][0] = 0; dp[u][1] = 1;//自己放的话先加上自己的,子节点的在下面遍历他们的时候会加上。 for (int i = 0; i < eg[u].size(); i++) { int v = eg[u][i]; dfs(v); dp[u][0] += dp[v][1]; dp[u][1] += min(dp[v][0], dp[v][1]); }}int main(){ while (scanf("%d", &n) != EOF) { memset(parent, -1, sizeof parent); memset(dp, 0, sizeof dp); int x, k, y; for (int i = 0; i < n; i++) { scanf("%d:(%d)", &x, &k); for (int j = 0; j < k; j++) { scanf("%d", &y); parent[y] = x; eg[x].push_back(y); } } int root = 0; while (parent[root] != -1) { root = parent[root]; } dfs(root); cout << min(dp[root][0], dp[root][1]) << endl; for (int i = 0; i < n; i++) eg[i].clear(); // }}

转载于:https://www.cnblogs.com/tttfu/p/11293746.html

你可能感兴趣的文章
TensorFlow学习笔记之三——适合入门的一些资源
查看>>
Javascript的数组通过ajax传到控制器里面。在。net中接受数组
查看>>
css设置:图片文字等不能被选择
查看>>
NodeJS初探之三——新星的力量
查看>>
Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'
查看>>
原生JavaScript第七篇
查看>>
winform图片标尺控件
查看>>
jQuery中$.ajax()方法中参数详解
查看>>
设计模式
查看>>
Java page 指令常用属性
查看>>
IE8以下IE浏览器无window.innerHeight属性解决方法
查看>>
永中DCS文档转换服务其它产品对比
查看>>
Node.js connect ECONNREFUSED错误
查看>>
redux的中间层 --reactjs学习
查看>>
洛谷 1330 封锁阳光大学
查看>>
CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And his Cake
查看>>
java 监控 收集资料(收集中)
查看>>
去除字符串前后的逗号;验证特殊字符
查看>>
使用git和tortoisegit获取kbengine的代码
查看>>
clojure.spec库入门学习
查看>>