HDU1011——Starship Troopers(树形DP),HDU1012——u Calculate e,HDU1013——Digital Roots

目录

HDU1011——Starship Troopers(树形DP)

题目描述

运行代码

代码思路

树形DP

HDU1012——u Calculate e

题目描述

运行代码

代码思路

HDU1013——Digital Roots

题目描述

超时代码

改进后依旧超时代码

运行代码

代码思路

HDU1011——Starship Troopers(树形DP)

题目描述

Problem - 1011

运行代码

#include <iostream>
#include <vector>using namespace std;const int MAXN = 110;
int n, m;
int cost[MAXN], weight[MAXN];
int dp[MAXN][MAXN];
bool visited[MAXN];
vector<int> tree[MAXN];  // 建树// 计算向上取整的除法结果
int ceilDiv(int num, int div) {return (num + div - 1) / div;
}// 比较两个整数并返回最大值
int maxValue(int a, int b) {return a > b ? a : b;
}// 深度优先搜索函数
void dfs(int p) {int i, j, k;int temp = ceilDiv(cost[p], 20);  // 攻打 p 至少需要 temp 个人for (i = temp; i <= m; i++)dp[p][i] = weight[p];visited[p] = true;  // 记录下已经处理 p 节点, 强制只能顺着树往下撸for (i = 0; i < tree[p].size(); i++) {int t = tree[p][i];if (visited[t])continue;dfs(t);for (j = m; j > temp; j--) {  // 树形背包, 容量从后向前推for (k = 1; k <= j - temp; k++)  // 留下 j - k 攻打 p, k 攻打儿子dp[p][j] = maxValue(dp[p][j], dp[p][j - k] + dp[t][k]);}}
}int main() {int i;while (cin >> n >> m, n != -1 || m != -1) {for (i = 0; i <= n; i++)tree[i].clear();memset(dp, 0, sizeof(dp));memset(visited, false, sizeof(visited));for (i = 1; i <= n; i++)cin >> cost[i] >> weight[i];for (i = 1; i < n; i++) {int u, v;cin >> u >> v;tree[u].push_back(v);tree[v].push_back(u);}if (m == 0) {cout << "0" << endl;continue;}dfs(1);cout << dp[1][m] << endl;}return 0;
}

代码思路

  1. 初始化:

    • MAXN定义数组的最大尺寸。
    • nm分别代表房间数和星际战士的数量。
    • cost[]weight[]数组分别存储每个房间内虫子的数量(访问成本)和是否可能包含大脑(1表示可能包含,0表示不包含)。
    • dp[][]是一个二维数组,用于动态规划,存储以一定数量的星际战士在每个房间能访问到的可能含大脑的房间的最大数量。
    • visited[]用于记录哪些房间已经被访问过。
    • tree[][]存储树结构,即每个房间连接的其他房间。
  2. 辅助函数:

    • ceilDiv()函数计算向上取整的除法结果,但在这个场景下,它实际上不需要,因为访问成本是固定的,直接比较即可。
    • maxValue()函数返回两个整数中的较大者。
  3. 深度优先搜索(DFS):

    • dfs()函数递归地遍历树结构。
    • 计算访问当前房间至少需要的星际战士数量。
    • 如果星际战士数量足够,初始化dp数组的相应位置为该房间可能含大脑的权重。
    • 标记当前房间为已访问。
    • 对于当前房间的所有子房间,递归调用dfs()
    • 在所有子房间处理完毕后,使用动态规划更新当前房间的dp值,考虑子房间的贡献。
  4. 主函数:

    • 循环读取输入,直到遇到结束标志(两个-1)。
    • 每次循环前清空树结构和重置dpvisited数组。
    • 读取房间描述和连接信息。
    • 特殊情况处理:如果m为0,则直接输出0。
    • 否则,调用dfs()函数从根节点开始。
    • 输出以m个星际战士在根节点(房间1)所能访问到的可能含大脑的房间的最大数量。

树形DP

树形动态规划(Tree Dynamic Programming,简称树形DP)是一种解决在树形结构上的最优化问题的策略,它结合了图论和动态规划技术。树形DP常用于解决以下类型的问题:

  1. 路径问题:如求树中两点间最长或最短路径、路径上的最大权值等。
  2. 子树问题:如求具有特定性质的子树的最大或最小值,或者求子树中的某些统计信息。
  3. 覆盖问题:如用最少的节点覆盖树中的所有节点,或者达到某种条件下的最佳覆盖方案。

树形DP的关键步骤包括:

  • 状态定义:确定DP状态,这通常涉及到子树的概念,比如dp[node][state]表示以node为根的子树在某种状态下的最优解。
  • 状态转移:在状态定义的基础上,找到父节点状态和子节点状态之间的关系,从而实现状态的传递。
  • 初始化:确定DP数组的初始状态,这通常是叶子节点或边界条件。
  • 计算顺序:由于树形DP依赖于子问题的解,所以通常采用深度优先搜索(DFS)或广度优先搜索(BFS)遍历树,确保总是先解决子问题再解决父问题。
  • 最终答案:确定最终问题的答案对应DP数组中的哪个状态。

树形DP的伪代码示例,用于解决一个关于子树最大值的问题:

def dfs(node):# 初始化dp[node]为某个初始值dp[node] = initial_value# 遍历当前节点的所有子节点for child in adj_list[node]:# 递归地解决子节点问题dfs(child)# 状态转移:更新当前节点的dp值dp[node] = max_function(dp[node], dp[child])# 主函数中调用dfs函数从根节点开始
dfs(root)

adj_list是一个邻接表,用于表示树的结构;initial_value是根据具体问题设定的初始值;max_function是一个函数,用于根据子节点的状态更新当前节点的状态,这通常涉及到某种最优化操作。

HDU1012——u Calculate e

题目描述

Problem - 1012

运行代码

#include <iostream>
#include <iomanip>
using namespace std;
int factor(int n) {int result = 1;for (int i = 1; i <= n; i++) {result *= i;}return result;
}int main() {cout << "n " << "e" << endl;cout << "- " << "-----------" << endl;printf("0 1\n");printf("1 2\n");printf("2 2.5\n");double e = 2.5;for (int n = 3; n <= 9; n++) {double term = 1.0 / factor(n);e += term;cout << n << " " << fixed << setprecision(9) << noshowpoint << e <<endl;}return 0;
}

代码思路

e可以通过下面的无穷级数来逼近:

  1. 定义factor函数:这个函数计算阶乘n!,即从1n的所有整数的乘积。使用一个循环从1n,将每个数乘到result变量上,最后返回result

  2. 设置输出格式:输出标题行,显示ne。使用cout输出分隔线,增加可读性。

  3. 初始化输出:直接输出e的前几项值(当n=0e=1n=1e=2n=2e=2.5),这是因为这些值可以直接计算,无需调用factor函数。

  4. 计算和输出后续项:使用一个循环从n=3n=9,每次迭代计算泰勒级数的下一项term,它是1除以n!的值。将term加到e的当前值上,以累加泰勒级数的和。使用cout和格式化指令(fixedsetprecisionnoshowpoint)输出n和当前的e的近似值。

HDU1013——Digital Roots

题目描述

Problem - 1013

超时代码

#include <iostream>
using namespace std;
int digit(int num) {int sum = 0;while (num > 0) {sum += num % 10;num /= 10;}if (sum < 10) {return sum;}else {return digit(sum);}
}int main() {int n;cin >> n;while (n != 0) {cout << digit(n) <<endl;cin >> n;}return 0;
}

改进后依旧超时代码

#include <iostream>
using namespace std;
int digit(int num) {return 1 + (num - 1) % 9;
}
int main() {int n;cin >> n;while (n != 0) {cout << digit(n) << endl;cin >> n;}return 0;
}

运行代码

#include <iostream>
#include <string>
using namespace std;
int digit(const string& numStr) {int num = 0;for (char c : numStr) {num += (c - '0');}int temp = num % 9;if (temp == 0) {return 9;}return temp;
}int main() {string numStr;while (cin >> numStr && numStr[0] != '0') {cout << digit(numStr) << endl;}return 0;
}

代码思路

模9的操作实际上是基于数字根(Digital Root)的概念,即一个数的数字根是将其所有数字相加,重复这个过程直到得到一个单数字的结果,这个结果对于任何数来说都是其各位数字相加之和模9的结果(除了全为9的特殊情况)。

  1. 定义digit函数

    • 函数接受一个字符串numStr作为参数,这个字符串表示一个正整数。
    • 通过遍历字符串中的每一个字符(字符代表数字),将字符转换为对应的整数(通过c - '0')并累加到num变量中。
    • 计算num模9的结果,如果结果为0,说明num能被9整除,函数返回9;否则,返回模9的结果。
  2. main函数

    • 使用一个无限循环读取标准输入中的字符串,直到读入的第一个字符是'0'为止。
    • 在循环内部,每次读取一个字符串numStr
    • 调用digit函数计算该字符串代表的数的数字根,并输出结果。
    • 当读入的字符串以'0'开头时,循环终止,程序结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端转base64格式的字体图标方法

1.将需要的字体图标包下载到本地 2.访问 transfonter.org 将字体图标转成base64格式 如 这样就可以和正常的字体图标一样使用了

【Git】Git Submodules 介绍(通俗易懂,总结了工作完全够用的 submodule 命令)

Git Submodules 介绍 1、为什么你值得读这篇文章&#xff1f;2、为什么有 submodules&#xff1f;3、了解 Git Submodules3.1、如何让一个Git仓库变为另一个Git仓库的 submodule3.2、submodule 的父子关系存在哪里3.3、submodule 的父子关系信息怎么存 4、submodule 开发常用操…

Token Labeling(NeurIPS 2021, ByteDance)论文解读

paper&#xff1a;All Tokens Matter: Token Labeling for Training Better Vision Transformers official implementation&#xff1a;https://github.com/zihangJiang/TokenLabeling 出发点 ViTs的局限性&#xff1a;尽管ViTs在捕捉长距离依赖方面表现出色&#xff0c; 但…

永远向有结果的人学习!

生活是一场漫长的旅程&#xff0c;充满了挑战和机遇。在这个过程中&#xff0c;我们不断地学习、成长&#xff0c;并从他人的经验中汲取智慧。今天&#xff0c;我想和大家分享一个重要的生活哲学&#xff1a;永远向有结果的人学习。 1. 敢于顶撞与撒野 我依旧敢和生活顶撞&am…

第二篇 Vue项目的搭建

1、脚手架安装 npm init vuelatest&#xff1a;官方提供的Vue项目脚手架工具&#xff0c;帮助我们搭建一个最简单的vue应用。 2、vs打开项目文件夹 打开脚手架生成的文件夹到vs并安装volar插件&#xff0c;以便vs能够支持vue格式代码 3、启动项目 npm run dev&#xff1a;vu…

国产麒麟、UOS在线打开pdf加盖印章

PageOffice支持两种电子印章方案&#xff0c;可实现对Word、Excel、PDF文档加盖PageOffice自带印章或ZoomSeal电子印章&#xff08;全方位保护、防篡改、防伪造&#xff09;。Word和Excel的盖章功能请参考&#xff1a;Word和Excel加盖印章和签字功能 &#xff08;目前只支持win…

css - - - - - 去除图片默认的白色背景(混合模式 mix-blend-mode)

去除图片默认的白色背景&#xff08;mix-blend-mode&#xff09; 1. 需求描述2. 原图展示3. 原代码展示4. 使用混合模式(mix-blend-mode)5.修改后效果 1. 需求描述 图片含有白色地图&#xff0c;想要将其去掉 2. 原图展示 3. 原代码展示 <div><img src*****/> &…

现场可重构CPLD芯片应用案例—蓝牙音箱

我司英尚微提供的高性能数模混合现场可重构IC、通用可配置的模数混合芯片内部集成丰富的模拟资源和数字资源&#xff0c;可轻松替代电路中的各种标准器件&#xff0c;并按照客户要求组合成最优小型ASIC&#xff0c;缩短开发周期&#xff0c;降低成本。下面介绍LS98002现场可重构…

vue3前端开发-小兔鲜项目-人气推荐栏目的前端渲染

vue3前端开发-小兔鲜项目-人气推荐栏目的前端渲染&#xff01;今天和大家分享一下&#xff0c;人气推荐栏目的前端页面如何渲染内容。 经历过上一次的&#xff0c;新鲜好物的栏目渲染之后&#xff0c;我们已经熟练了&#xff0c;vue3的接口调用&#xff0c;数据渲染到页面中的整…

golang开发环境搭建与踩坑记录

文章目录 一、安装下载1、go环境2、ide 二、基本使用1、运行2、结构体与方法函数指针3、闭包4、指针5、map6、接口7、异常 三、包管理1、go mod语法2、项目下载所有依赖 一、安装下载 1、go环境 下载地址&#xff1a;https://go.dev/dl/ 或者&#xff1a;https://golang.goog…

【动态规划】力扣2266.统计打字方案数

Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。在这里插入图片描述 为了 打出 一个字母&#xff0c;Alice 需要 按 对应字母 i 次&#xff0c;i 是该字母在这个按键上所处的位置。 比方说&#xff0c;为了按出字母 ‘s’ &#xff0c;Alice 需要按 ‘7’ 四次。…

DP-适配器模式代码重新理解

package com.designpatterns.adapter;/*** 定义鸭子接口*/ public interface Duck {/*** 定义鸭子呱呱叫(quack)*/public void quack();public void fly(); }package com.designpatterns.adapter;/*** 实现一个绿头鸭*/ public class MallarDuck implements Duck{Overridepubl…

Linux中运用xsync实现免密集群分发

一、前言 今天搭建了三台虚拟机的集群&#xff0c;在集群中部分操作在三台虚拟机上的操作都一致&#xff0c;为了提高效率&#xff0c;就需要配置xsync实现集群分发。 二、设置免密登录 1.生成公钥和私钥 ssh-keygen -t rsa一直敲回车&#xff0c;会生成两个文件&#xff0c…

灵雀云AML:赋能金融AI,构建数智时代核心竞争力

在人工智能&#xff08;AI&#xff09;技术的迅猛发展中&#xff0c;金融行业正迈入变革的新时代。AI不仅在优化投资决策、信用评估、实时监控和欺诈识别方面展现出强大功能&#xff0c;还极大地提升了客户体验、降低了运营成本&#xff0c;并推动了产品创新。面对智能时代的挑…

C#知识|账号管理系统:多条件动态查询条件的编写。

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 在项目开发中涉及到许多通过多个条件勾选来实现动态的多个条件查询的情况&#xff0c; 此节记录多条件查询的后台代码编写&#xff0c;以下为学习笔记。 01 实现原理 通过界面输入框输入或者下拉框下拉选择任意查询…

《RuoYi基于SpringBoot+Vue前后端分离的Java快速开发框架学习》系列博客_Part2_添加菜单

系列文章目录 Part1:启动RouYi 文章目录 系列文章目录Part1:启动RouYi 实现添加菜单功能来显示新的音图分析页面&#xff08;所截图片都是在已经添加菜单完成后的情况下&#xff09;一、建立一个菜单二、建立数据库1、通过数据库软件建立一个表&#xff0c;供我们使用&#xf…

【Ngix】快速上手,由浅入深

内容概述 1、nginx 简介 &#xff08;1&#xff09;介绍 nginx 的应用场景和具体可以做什么事情 &#xff08;2&#xff09;介绍什么是反向代理 &#xff08;3&#xff09;介绍什么是负载均衡 &#xff08;4&#xff09;介绍什么是动静分离 2、nginx 安装 &#xff08;1…

Leetcode - 周赛406

目录 一&#xff0c;3216. 交换后字典序最小的字符串 二&#xff0c;3217. 从链表中移除在数组中存在的节点 三&#xff0c;3218. 切蛋糕的最小总开销 I 四&#xff0c;3219. 切蛋糕的最小总开销 II 一&#xff0c;3216. 交换后字典序最小的字符串 本题要求交换一次相邻字符…

大数据架构对比记录

Lambda架构 -维护两套项目&#xff0c;开发和维护成本高 -两套链路&#xff0c;数据容易不一致 -数据计算成本大&#xff08;例如原定每小时计算一次&#xff0c;但有额外新需求需要计算两点半-三点半之间数据&#xff0c;则需要重新计算&#xff09; Kappa -过于依赖kafka消…

FPGA:基于复旦微FMQL10S400 /FMQL20S400 国产化核心板

复旦微电子是国内集成电路设计行业的领军企业之一&#xff0c;早在2000年就在香港创业板上市&#xff0c;成为行业内首家上市公司。公司的RFID芯片、智能卡芯片、EEPROM、智能电表MCU等多种产品在市场上的占有率位居行业前列。 今天介绍的是搭载复旦微 FMQL10S400/FMQL20S400的…