洛谷P2016战略游戏
2024-10-29 15:33:46
传送门啦
战略游戏这个题和保安站岗很像,这个题更简单,这个题求的是士兵人数,而保安站岗需要求最优价值。
定义状态$ f[u][0/1] $ 表示 $ u $ 这个节点不放/放士兵
根据题意,如果当前节点不放置士兵,那么它的子节点必须全部放置士兵,因为要满足士兵可以看到所有的边,所以
$ f[u][0]+=f[v][1] $ ,其中$ v $ 是 $ u $ 的子节点
如果当前节点放置士兵,它的子节点选不选已经不重要了(因为树形dp自下而上更新,上面的节点不需要考虑),所以
$ f[u][1]+=min(f[v][0],f[v][1]) $
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1505;
inline int read(){
char ch = getchar();
int f = 1 , x = 0;
while(ch > '9' || ch < '0'){if(ch == '-')f = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}
return x * f;
}
int n,flag,k,x;
int head[maxn],tot;
int f[maxn][5];
struct Edge{
int from,to,next;
}edge[maxn << 1];
void add(int u,int v){
edge[++tot].from = u;
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot;
}
void dfs(int u,int fa) {
f[u][1] = 1 , f[u][0] = 0;
for(int i=head[u];i;i=edge[i].next) {
int v = edge[i].to;
if(v != fa) {
dfs(v , u);
f[u][0] += f[v][1];
f[u][1] += min(f[v][1] , f[v][0]);
}
}
}
int main(){
n = read();
for(int i=0;i<=n-1;i++){
flag = read(); k = read();
if(k == 0)continue;
for(int i=1;i<=k;i++){
x = read();
add(flag , x); add(x , flag);
}
}
dfs(0 , -1);
printf("%d\n",min(f[0][1] , f[0][0]));
return 0;
}
最新文章
- 最近学习linux命令的一个总结
- wsimport命令讲解
- ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节
- http://blog.sina.com.cn/s/blog_5bd6b4510101585x.html
- Eclipse中使用maven构建web项目中遇到的问题
- 崩溃恢复(crash recovery)与 AUTORESTART参数
- 为nginx增加nginx_http_concat模块
- Cimg代码初探
- Qt中使用随机数
- 全排列 Permutations
- JQuery请求WebService返回数据的几种处理方式
- Objective-c (多输入参数的方法)
- ExtJS中form提交之后获取返回的json值
- Cmake常用指令
- 微信小程序(兼容性问题)
- HTML <;area>;<;map>;标签及在实际开发中的应用
- nginx+apache前后台搭配使用
- struts2--实现自定义拦截器
- MySQL关系表查询两个表的数据
- javasciprt性能优化