//题意:就是你需要派最少的士兵来巡查每一条边。相当于求最少点覆盖,用最少的点将所有边都覆盖掉
//题解:
//因为这是一棵树,所以对于每一条边的两个端点,肯定要至少有一个点需要放入士兵,那么对于x->y这一条边
//dp[x][0]=0 表示在x这一点上不放人士兵
//dp[x][1]=1 表示在x这一个点上放入士兵
//那么就有
//dp[x][0]+=dp[y][1];
//dp[x][1]+=min(dp[y][0],dp[y][1]);

//注意这一道题不需要建立一个图,然后再去dfs,因为题目上就是按树从根到叶逐渐给出的。所以可以直接存
//belong用来表示每一个点的层数,pre表示它的父亲节点

第一次我是建了一个图去找dp,然后就MLE了

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=1500;
7 struct edge
8 {
9 int v,next;
10 }e[maxn];
11 int cnt,head[maxn],dp[maxn][5];
12 void add_edge(int x,int y)
13 {
14 e[cnt].v=y;
15 e[cnt].next=head[x];
16 head[x]=cnt++;
17 }
18 int n;
19 void dfs(int x,int pre)
20 {
21 dp[x][0]=0;
22 dp[x][1]=1;
23 for(int i=head[x];i!=-1;i=e[i].next)
24 {
25 int to=e[i].v;
26 //printf("%d %d\n",x,to);
27 if(to==pre)
28 {
29 //printf("**%d**%d\n",x,to);
30 continue;
31 }
32 dfs(to,x);
33 dp[x][0]+=dp[to][1];
34 dp[x][1]+=min(dp[to][1],dp[to][0]);
35 }
36 }
37 int main()
38 {
39 while(~scanf("%d",&n))
40 {
41 memset(head,-1,sizeof(head));
42 cnt=0;
43 memset(dp,0,sizeof(dp));
44 int x,y,sum,u,flag=0;
45 for(int i=1;i<=n;++i)
46 {
47 scanf("%d:(%d)",&x,&sum);
48
49 x++;
50 if(flag==0)
51 {
52 flag=1;
53 u=x;
54 }
55 while(sum--)
56 {
57 scanf("%d",&y);
58 y++;
59 add_edge(x,y);
60 add_edge(y,x);
61 }
62 }
63 //printf("%d**\n",u);
64 dfs(u,u);
65 printf("%d\n",min(dp[u][0],dp[u][1]));
66 }
67 return 0;
68 }

正解:

 1 //题意:就是你需要派最少的士兵来巡查每一条边。相当于求最少点覆盖,用最少的点将所有边都覆盖掉
2 //题解:
3 //因为这是一棵树,所以对于每一条边的两个端点,肯定要至少有一个点需要放入士兵,那么对于x->y这一条边
4 //dp[x][0]=0 表示在x这一点上不放人士兵
5 //dp[x][1]=1 表示在x这一个点上放入士兵
6 //那么就有
7 //dp[x][0]+=dp[y][1];
8 //dp[x][1]+=min(dp[y][0],dp[y][1]);
9
10 //注意这一道题不需要建立一个图,然后再去dfs,因为题目上就是按树从根到叶逐渐给出的。所以可以直接存
11 //belong用来表示每一个点的层数,pre表示它的父亲节点
12 #include<stdio.h>
13 #include<string.h>
14 #include<iostream>
15 #include<algorithm>
16 using namespace std;
17 const int maxn=1505;
18 int belong[maxn],pre[maxn],dp[maxn][5],cnt;
19 int n;
20 void DP(int x,int index)
21 {
22 dp[x][0]=0;
23 dp[x][1]=1;
24 for(int i=1;i<=n;++i)
25 {
26 if(pre[i]==x)
27 {
28 DP(i,index+1);
29 dp[x][0]+=dp[i][1];
30 dp[x][1]+=min(dp[i][0],dp[i][1]);
31 }
32 }
33 }
34 int main()
35 {
36 while(~scanf("%d",&n))
37 {
38 memset(pre,0,sizeof(pre));
39 memset(dp,0,sizeof(dp));
40 memset(belong,0,sizeof(belong));
41 cnt=0;
42 int x,y,sum,u,flag=0;
43 for(int i=1;i<=n;++i)
44 {
45 scanf("%d:(%d)",&x,&sum);
46 x++;
47 belong[x]=++cnt;
48 if(flag==0)
49 {
50 flag=1;
51 u=x;
52 }
53 cnt++;
54 while(sum--)
55 {
56 scanf("%d",&y);
57 y++;
58 pre[y]=x;
59 // add_edge(x,y);
60 // add_edge(y,x);
61 belong[y]=cnt;
62 }
63 }
64 pre[u]=-1;
65 DP(u,1);
66 printf("%d\n",min(dp[u][0],dp[u][1]));
67 }
68 return 0;
69 }

Strategic game POJ - 1463 树型dp的更多相关文章

  1. poj 2378 树型dp

    和poj1655那道求树的重心基本上一样的,代码也没多大改动. 详情请见 #include<cstdio> #include<algorithm> #include<cs ...

  2. 树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463

    B - Strategic game POJ - 1463   题目大意:给你一棵树,让你放最少的东西来覆盖所有的边   这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处 ...

  3. 【POJ 3140】 Contestants Division(树型dp)

    id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS   Memory Limit: 65536K Tot ...

  4. 【POJ 2486】 Apple Tree(树型dp)

    [POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8981   Acce ...

  5. POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断

    好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...

  6. HDU_1520_Anniversary party_树型dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  7. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

  8. 【XSY1905】【XSY2761】新访问计划 二分 树型DP

    题目描述 给你一棵树,你要从\(1\)号点出发,经过这棵树的每条边至少一次,最后回到\(1\)号点,经过一条边要花费\(w_i\)的时间. 你还可以乘车,从一个点取另一个点,需要花费\(c\)的时间. ...

  9. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

随机推荐

  1. HAProxy-1.8.20 根据后缀名转发到后端服务器

    global maxconn 100000 chroot /data/soft/haproxy stats socket /var/lib/haproxy/haproxy.sock mode 600 ...

  2. SQL注入-流程

    一般注入分类: 时间,布尔,报错,堆,联合 有关函数介绍: current_user() 当前用户名 session_user() 链接数据库的用户名 @@basedir mysql安装路径 @@da ...

  3. 【Spring】Spring中的Bean - 4、Bean的生命周期

    Bean的生命周期 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 了解Spring中Bean的生命周期有何意义? 了解Sp ...

  4. Databricks 第7篇:管理Secret

    有时,访问数据要求您通过JDBC对外部数据源进行身份验证,可以使用Azure Databricks Secret来存储凭据,并在notebook和job中引用它们,而不是直接在notebook中输入凭 ...

  5. Lua大量字符串拼接方式效率对比及原因分析

    Lua大量字符串拼接方式效率对比及原因分析_AaronChan的博客-CSDN博客_lua字符串拼接消耗 https://blog.csdn.net/qq_26958473/article/detai ...

  6. 【汇编实践】go assembly

    https://mp.weixin.qq.com/s/B577CdUkWCp_XgUc1VVvSQ asmshare/layout.md at master · cch123/asmshare htt ...

  7. 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型

    小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...

  8. 大数据之Hadoop技术入门汇总

    今天,小编对Hadoop入门学习知识进行了汇总,帮助大家更好地入手大数据.小编关于Hadoop入门总共发写了12篇原创文章,文章是参照尚硅谷大数据视频教程来进行撰写的. 今天,小编带你解锁正确的阅读顺 ...

  9. Webpack4.0各个击破(6)loader篇

    目录 一. loader综述 二. 如何写一个loader 三. loader的编译器本质 [参考] 一. loader综述 loader是webpack的核心概念之一,它的基本工作流是将一个文件以字 ...

  10. 【ElasticSearch】 使用AWS云ES服务来分析程序日志

    最近公司系统升级,有些API的调用接口达到了每天10几万的请求量.目前公司里的日志,都是写文本文件中的.为了能够更好的分析这些日志数据,公司采用了AWS 的 ElasticSearch服务来分析日志. ...