P2016 战略游戏

这道题的城堡是一颗树
题中有

注意,某个士兵在一个结点上时,与该结点相连的所有边将都可以被了望到。

所以定义数组f[i][1/0]f[i][1/0]f[i][1/0]表示的是节点i上放士兵或者不放士兵
根据题意,如果当前节点不放置士兵,那么它的子节点必须全部放置士兵,因为要满足士兵可以看到所有的边。
所以有 { } { } { } { } { } { } { } { } { } { } { } { } { } { } { } { } { }f[u][0]+=f[v][1]f[u][0]+=f[v][1]f[u][0]+=f[v][1]{ } { } { } { } { } { } { } { } { } { } { } 其中v是u的子节点
如果当前节点放置士兵,它的子节点选不选已经不重要了(因为树形dp自下而上,上面的节点不需要考虑),所以{ } { } { } { } { } { } { } { } { } { } { } { } { } { } { } f[u][1]+=min(f[v][0],f[v][1])f[u][1]+=min(f[v][0],f[v][1])f[u][1]+=min(f[v][0],f[v][1])

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<math.h>#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)using namespace std;
typedef long long ll;//全用ll可能会MLE或者直接WA,试着改成int看会不会A
const ll N=4000;
const ll INF=1e9+9;
const ll mod=2147483647;
const double EPS=1e-10;//-10次方约等于趋近为0
const double Pi=3.1415926535897;template<typename T>void read(T &x)
{x=0;char ch=getchar();ll f=1;while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x*=f;
}struct node
{ll v,nex;
}e[N];ll head[N],cnt,n,m,k,x;
ll f[N][2];//二维的只需要0或1即可,开大了memset会超时
ll t,arr[N],rt;inline void add(ll u,ll v)
{e[++cnt].nex=head[u];e[cnt].v=v;head[u]=cnt;
}inline void init()
{memset(f,0,sizeof f);memset(head,0,sizeof head);memset(arr,0,sizeof arr);cnt=0;
}
void dfs(ll u)
{f[u][0]=0,f[u][1]=1;//站或不站,站则至少需要1名士兵for(ll i=head[u];i;i=e[i].nex){dfs(e[i].v);//往下遍历f[u][0]+=f[e[i].v][1];//若不站则相邻的必须站有士兵f[u][1]+=min(f[e[i].v][1],f[e[i].v][0]);}
}int main()
{while(scanf("%lld",&n)!=EOF){init();over(j,1,n){ll a,b;scanf("%lld%lld",&a,&b);over(i,1,b){ll c;scanf("%lld",&c);arr[c]++;add(a,c);//树是有向图}}over(i,0,n){if(!arr[i])//找根{rt=i;break;}}dfs(rt);printf("%lld\n",min(f[rt][1],f[rt][0]));}return 0;
}

双倍经验UVA1292 Strategic game

只有输入有些许的不同

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<math.h>#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)using namespace std;
typedef long long ll;//全用ll可能会MLE或者直接WA,试着改成int看会不会A
const ll N=4000;
const ll INF=1e9+9;
const ll mod=2147483647;
const double EPS=1e-10;//-10次方约等于趋近为0
const double Pi=3.1415926535897;template<typename T>void read(T &x)
{x=0;char ch=getchar();ll f=1;while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x*=f;
}struct node
{ll v,nex;
}e[N];ll head[N],cnt,n,m,k,x;
ll f[N][2];//二维的只需要0或1即可,开大了memset会超时
ll t,arr[N],rt;inline void add(ll u,ll v)
{e[++cnt].nex=head[u];e[cnt].v=v;head[u]=cnt;
}inline void init()
{memset(f,0,sizeof f);memset(head,0,sizeof head);memset(arr,0,sizeof arr);cnt=0;
}
void dfs(ll u)
{f[u][0]=0,f[u][1]=1;//站或不站,站则至少需要1名士兵for(ll i=head[u];i;i=e[i].nex){dfs(e[i].v);//往下遍历f[u][0]+=f[e[i].v][1];//若不站则相邻的必须站有士兵f[u][1]+=min(f[e[i].v][1],f[e[i].v][0]);}
}int main()
{while(scanf("%lld",&n)!=EOF){init();over(j,1,n){ll a,b;scanf("%lld:(%lld)",&a,&b);over(i,1,b){ll c;scanf("%lld",&c);arr[c]++;add(a,c);//树是有向图}}over(i,0,n){if(!arr[i])//找根{rt=i;break;}}dfs(rt);printf("%lld\n",min(f[rt][1],f[rt][0]));}return 0;
}

注:如果您通过本文,有(qi)用(guai)的知识增加了,请您点个赞再离开,如果不嫌弃的话,点个关注再走吧,日更博主每天在线答疑 ! 当然,也非常欢迎您能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答!( •̀ ω •́ )✧

【每日DP】day14、P2016 战略游戏(树形DP模板)难度⭐⭐⭐相关推荐

  1. P2016 战略游戏[树形dp]

    题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...

  2. 洛谷P2016 战略游戏 - 树形DP

    一.题目 战略游戏 二.分析 dp1[i] : 第i个节点站士兵,照亮以i为节点的子树所需最少的士兵数: dp0[i] : 第i个节点不站士兵,照亮以i为节点的子树所需最少的士兵数: 状态转移方程: ...

  3. AcWing323. 战略游戏(树形DP)题解

    题目传送门 题目描述 鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他找不到解决问题的方法,这让他很伤心. 现在他有以下问题. 他必须保护一座中世纪城市,这条城市的道路构成了一棵树. 每个节点上的士兵可以 ...

  4. 323. 战略游戏 (树形dp)

    题目 题意: 给定n个点的树,选择最少的点,使得可以涵盖到所有的边.(不一定n-1条边,至多10*n条边) 思路: 树形dp. f[i][0]: 以i为根且选择i的最少点数的方案 f[i][1]: 以 ...

  5. 战略游戏——树形dp+状态机——没有上司的舞会翻版

    战略游戏 思路: 由根节点出发,根据状态进行转移: 状态转移方程: f[u][0] +=f[i][1];f[u][1] += min(f[i][0],f[i][1]); 代码 #include < ...

  6. 洛谷P2016 战略游戏【树形dp】

    P2016 战略游戏 时间限制 1.00s 内存限制 125.00MB 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡 ...

  7. 洛谷P2016战略游戏

    传送门啦 战略游戏这个题和保安站岗很像,这个题更简单,这个题求的是士兵人数,而保安站岗需要求最优价值. 定义状态$ f[u][0/1] $ 表示 $ u $ 这个节点不放/放士兵 根据题意,如果当前节 ...

  8. P2016 战略游戏

    一道还算比较好写的"求树的最大独立集"的问题. f [ x ] [ 0 ] 表示以x为节点的子树上,在x位置不放士兵时,士兵数量的最小值: f [ x ] [ 1 ] 表示以x为节 ...

  9. [AtCoder Educational DP Contest] V - Subtree(树形dp + 前缀积/后缀积)

    problem luogu 给一棵树,对每一个节点染成黑色或白色. 对于每一个节点,求强制把这个节点染成黑色的情况下,所有的黑色节点组成一个联通块的染色方案数,答案对 MMM 取模. 1≤n≤1e5, ...

最新文章

  1. Linux 开机文件系统发生错误
  2. 计算机世界的虚拟机,容器和医学界的人工硬脑膜
  3. [转]kafka介绍
  4. Linux(12)-命令行的使用,shell脚本
  5. 在SQL中使用PL/SQL函数存在的问题
  6. redis中有key但是删不掉_分布式锁用 Redis 还是 Zookeeper
  7. 问题三十五: 怎么用ray tracing画二次曲面(quadratic surfaces)(3)——椭球抛物面
  8. android singletask启动模式,Android SingleTask启动模式与Home键的问题
  9. 民营企业该如何留住人才
  10. 南佛罗里达大学计算机科学硕士,南佛罗里达大学计算机科学理学硕士研究生申请要求及申请材料要求清单...
  11. linux下的lib文件
  12. js + css 做出网易云音乐的轮播图
  13. EasyExcel web下载excel,多sheet页demo
  14. Gradle依赖项之transitive/exclude/force/(+)
  15. 如何构建更好的内容分发网络?
  16. 【生活】空调工作原理及基本操作
  17. 让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析
  18. matlab plv,一种基于微状态的脑功能网络构建方法与流程
  19. [前端] Chrome浏览器默认显示最小字号为12px
  20. 3度带6度带换算以及带号计算

热门文章

  1. 利用OpenCV建立视差图像
  2. 最小邮票数(01背包)
  3. EditText禁止输入回车
  4. SHELL-命令解释程序
  5. Nginx 源码编译安装
  6. 关于javascript闭包中的this对象
  7. a_2可以用作python标识符嘛,【单选题】下列选项中,可作为Python标识符的是哪项? A. getpath() B. throw C. my#var D. _ My_price...
  8. allgro显示网络名称_家里的路由器如何隐藏WiFi名称防止陌生人蹭网?SSID隐藏教程...
  9. byte数组截取_Go解密:数组、切片
  10. 你还在这样学习Python吗?真的不可以