首页 > 其他分享 >P2016 战略游戏

P2016 战略游戏

时间:2023-10-02 09:23:46浏览次数:34  
标签:游戏 min int P2016 战略 士兵 放置 节点 dp

Problem

考察算法:树形 \(DP\)。

题目简述

给你一个树,如果树上的某个节点上放置了一个士兵,那么与其相连的所有边上的点都能被瞭望到。

求:最少要放置几个士兵,能使得整个树上每个点都能被瞭望到?

思路

设 二维数组 \(f[x][0/1]\)。

  • \(f[x][0]\) 表示不在 \(x\) 点放置士兵而使 \(x\) 节点及其所有子树上的点都能被瞭望到的最小放置士兵数。
  • \(f[x][1]\) 表示在 \(x\) 点放置士兵而使 \(x\) 节点及其所有子树上的点都能被瞭望到的最小花费。

最终的答案为:\(\min(f[r][0], f[r][1])\)。\(r\) 表示这个树的根,由于本题没有给根,所以需要自己找一下。

状态转移方程设计:

  • 如果当前节点不放置士兵,那么它的子节点必须全部放置士兵,因为要满足士兵可以看到所有的边。

    则:\(f[x][0] += f[to][1]\)

    \(to\) 是 \(x\) 的子节点。

  • 如果当前节点放置士兵,它的子节点选不选已经不重要了,则取最小值即可。

    则:\(f[x][1] += \min(f[to][0], f[to][1])\)。

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1600;
struct node{
	int to, next;
}  a[N << 1];
int pre[N], k, dp[N][2], fa[N];
int n, c, idx, x;
vector<int> G[N];

void dfs(int x, int fath) {
	dp[x][0] = 0, dp[x][1] = 1; // 边界条件
	for (int i = 0; i < G[x].size(); i++) {
		int to = G[x][i];
		if (to != fath) { // 不能返回去
			dfs(to, x);
			dp[x][0] += dp[to][1];
			dp[x][1] += min(dp[to][0], dp[to][1]);
		}
	}
}

int main() {
	memset(fa, -1, sizeof(fa)); // 初始化
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d%d", &idx, &c);
		for (int j = 1; j <= c; j++) {
			scanf("%d", &x);
			G[idx].push_back(x);
			fa[x] = idx; // 记录每个节点的父亲,便于找根
		}
	}
	int root;
	for (int i = 0; i < n; i++) if (fa[i] == -1) root = i; // 找根
	dfs(root, -1);
	printf("%d", min(dp[root][0], dp[root][1]));
	return 0;
}

标签:游戏,min,int,P2016,战略,士兵,放置,节点,dp
From: https://www.cnblogs.com/yhx0322/p/17739710.html

相关文章

  • 运行游戏!
    1.编辑运行配置当前项目中有很多代码,所以需要提醒IntelliJ运行哪些代码。要告诉它该运行Game.java,需要转至“运行”>“编辑配置”,然后设置新配置。编辑配置...下拉菜单。然后在“运行配置”窗口中点击窗口左上方的 + 按钮,添加一个新的配置,然后选择应用程序。然后......
  • 下载井字游戏
    在这个IntelliJ项目中,你需要下载井字游戏代码,并完成这个项目! 为了确保正确导入代码,必须遵守这些说明。我们开始吧!1.下载井字游戏代码这个井字游戏项目的所有代码都在 javagithub仓库(点击此处)中。Github为我们提供了一个在线存储程序的地方,这样就可以共享和编辑代码。如......
  • 二十四点游戏Python实现
    二十四点游戏是一种数学益智游戏,通过组合四个数字和四种基本运算符(加、减、乘、除),使得计算结果等于24。在本文中,我们将使用Python语言实现这个游戏。一、游戏规则1、从给定的四个数字中选取任意两个数字,并选择一个运算符进行计算。2、将计算结果与剩余的两个数字结合,再选择一个运算......
  • 游戏中的数学:矩阵
    一个mxn矩阵是一个m行n列的矩形数组。矩阵中每一项叫做矩阵的元素(Element),行数和列数指定了矩阵的维数。下面是一个2×3矩阵的例子:$\begin{bmatrix}1&2&3\\4&5&6\end{bmatrix}$矩阵可以通过(i,j)进行索引,i是行,j是列,一共2行3列,因此叫做2×3矩阵的原因(2×3也叫做矩......
  • NO.3 C语言实现贪吃蛇游戏(Linux)
     一、简易说明:实现了初步的游戏模型,可以玩,但有一些细节bug没有解决。用WASD控制方向  二、源代码+头文件1#include<stdio.h>2#include"snake.h"34567intmain(intargc,constchar*argv[])8{91011system("cl......
  • Leetcode 45. 跳跃游戏 II
    https://leetcode.cn/problems/jump-game-ii/description/给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums[i+j]处:0<=j<=nums[i]i+j<n......
  • python贪吃蛇模块设计一(真正的游戏效果还未实现)
    importrandomimporttimeimportturtle#分数score=0#最高分heigh_score=0#移动延迟delay=0.2#创建屏幕window=turtle.Screen()#设置标题window.title("贪吃蛇")#背景颜色window.bgcolor("white")#窗口大小window.setup(width=600,height=600)#创建蛇head=t......
  • js 游戏编程:(平滑跟随算法+碰撞检测算法) 贪吃蛇
    相信大家都用c语言写过贪吃蛇吧!今天让我们来试试js写的贪吃蛇!<metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no"/><style>@keyframesrot{0%{transform:rota......
  • 【闲暇一写】用Python编写2048游戏(命令行版)
    本篇博文围绕使用Python开发热门游戏2048GAME(命令行版本)代码未做任何优化(原生且随意)、全程以面向过程、MVC的设计思想为主、开发环境是Ubuntu系统下的Pycharm2048是我很久以前学习Python过程中的一个作业,接下来直入正题——一、了解游戏1.介绍《2048》是一款单人在线和移......
  • 【闲暇一写】用Python编写2048游戏(命令行版)
    本篇博文围绕使用Python开发热门游戏2048GAME(命令行版本)代码未做任何优化(原生且随意)、全程以面向过程、MVC的设计思想为主、开发环境是Ubuntu系统下的Pycharm2048是我很久前学习Python过程中的一个作业,直入正题——一、了解游戏1.介绍《2048》是一款单人在线和移动端游戏......