简单版的动态规划
来源:互联网 发布:淘宝暴露狂买家秀 编辑:程序博客网 时间:2024/04/27 15:57
问题描述
小北很喜欢玩计算机游戏,特别是战略游戏,但是有时他不能尽快找到解所以常常感到很沮丧。现在面临如下问题:他必须在一个中世纪的城堡里设防,城堡里的道路形成一棵无向树。要在结点上安排最少的士兵使得他们可以看到所有边。你能帮助他吗?
你的任务是给出士兵的最少数目。
输入格式
输入包含多组数据。每组数据表示一棵树,在每组数据中:
第一行是结点的数目。
接下来的几行,每行按如下格式描述一个结点:
结点标识符 : ( 道路的数目 ) 结点标识符1 结点标识符2 ...... 结点标识符道路的数目
或者
结点标识符 : (0)
对于 n (0<n<=1500) 个结点,结点标识符是一个从 0 到 n - 1 的整数。每条边在测试用例中只出现一次。
输出格式
对于每组数据,各给出一个整数表示士兵的最少数目.
测试输入
40:(1) 11:(2) 2 32:(0)3:(0)53:(3) 1 4 21:(1) 02:(0)0:(0)4:(0)
测试输出
12
源代码
#include <stdio.h> #include <string.h> #define min(x,y) ((x>y)?y:x) #define N 1504 int dp[N][2], father[N], v[N], n; int main() { int i, j, k, t1, t2, root=0; void DFS(int root); while(scanf("%d",&n)!=EOF){ memset(dp,0,sizeof(dp)); memset(father,0,sizeof(father)); memset(v,0,sizeof(v)); for(i=0;i<n;i++){ scanf("%d:(%d)",&t1,&t2); if(i==0) root=t1; for(j=0;j<t2;j++){ scanf("%d",&k); father[k]=t1; } } DFS(root); printf("%d\n",min(dp[root][0],dp[root][1])); } return 0; } void DFS(int root) { v[root]=1; for(int i=0;i<n;i++){ if(!v[i] && father[i]==root){ DFS(i); dp[root][1]=dp[root][1]+dp[i][0]; dp[root][0]=dp[root][0]+min(dp[i][0],dp[i][1]); } } dp[root][0]++; }
0 0
- 简单版的动态规划
- poj1221简单的动态规划
- HDU2084 简单的 动态规划
- 简单的动态规划题
- 简单的动态规划问题(帮助理解动态规划)
- poj 1609简单的动态规划
- 一个简单的动态规划题
- ACM/ICPC 动态规划的简单讲解
- 最简单的动态规划之POJ1063
- 动态规划的初次接触,简单分析
- HDU 1267(简单的动态规划)
- 一个简单的动态规划问题
- HDU 1158(简单的动态规划)
- 简单的动态规划 Max Sum
- 对动态规划算法的简单理解
- 一道简单的动态规划题
- poj 2229,简单的动态规划
- 第十周 简单的动态规划
- JAVA基础知识整理(二)
- 03-树3 Tree Traversals Again【建树遍历】
- 使用MyEclipse 2017 的逆向工程生成hibernate映射文件
- FormData 对象的使用
- 基础练习 字母图形 (JAVA版)
- 简单版的动态规划
- 学术笔记·计算机领域的若干个基本问题·十二
- RandomAccessFile
- 设计模式
- hdu 1864 最大报销额(小数变整数,01背包)
- 卷积版本的GAN: DCGANs
- [计算几何] [BZOJ4246] 两个人的星座
- javaScript外部对象
- Mybatis学习(一)环境搭建之踩坑