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

news2024/9/22 4:16:53

目录

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.coloradmin.cn/o/1935541.html

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

相关文章

工时记录软件选型指南

国内外主流的10款工时计算软件对比&#xff1a;PingCode、Worktile、Tita、易企秀、奇鱼、Teambition、Timely、Toggl Track、RescueTime、ClickUp。 在忙碌的工作中&#xff0c;记录和管理工时常常是令人头疼的问题。工时记录软件的选择不仅能帮你省时省力&#xff0c;还能大幅…

视频素材网站无水印的有哪些?热门视频素材网站分享

当我们走进视频创作的精彩世界时&#xff0c;一个难题常常摆在面前——那些高品质、无水印的视频素材究竟应该在哪里寻找&#xff1f;许多视频创作者感叹&#xff0c;寻找理想的视频素材难度甚至超过了寻找伴侣&#xff01;但不用担心&#xff0c;今天我将为您介绍几个优质的视…

理解UI设计:UI设计师的未来发展机遇

UI设计师的出现是互联网时代的设计变革。随着移动互联网的快速发展&#xff0c;移动产品设计师非常短缺。高薪资让许多其他行业的设计师已经转向了UI设计。那么什么是UI设计呢&#xff1f;UI设计师负责什么&#xff1f;UI设计的发展趋势和就业前景如何&#xff1f;这些都是许多…

C++仓库管理系统

功能 代码在效果图后面 1.添加物品 2.删除物品 3.更新物品数量 4.查询物品 5.列出所有物品 6.保存并退出 注意事项&#xff1a;退出要输入“6”退出才能保存数据&#xff0c;不要直接按X关掉窗口&#xff08;不会保存数据&#xff09;。 效果图 源代码 编…

C语言 底层逻辑详细阐述指针(一)万字讲解 #指针是什么? #指针和指针类型 #指针的解引用 #野指针 #指针的运算 #指针和数组 #二级指针 #指针数组

文章目录 前言 序1&#xff1a;什么是内存&#xff1f; 序2&#xff1a;地址是怎么产生的&#xff1f; 一、指针是什么 1、指针变量的创建及其意义&#xff1a; 2、指针变量的大小 二、指针的解引用 三、指针类型存在的意义 四、野指针 1、什么是野指针 2、野指针的成因 a、指…

Unity客户端接入原生Google支付

Unity客户端接入原生Google支付 1. Google后台配置2. 开始接入Java部分C#部分Lua部分 3. 导出工程打包测试参考踩坑注意 1. Google后台配置 找到内部测试&#xff08;这个测试轨道过审最快&#xff09;&#xff0c;打包上传&#xff0c;这个包不需要接入支付&#xff0c;如果已…

机器人开源调度系统OpenTcs6-架构运行分析

系统启动 启动 Kernel&#xff1a;加载核心应用&#xff0c;初始化系统配置和状态。 启动 Plant Overview&#xff1a;加载图形用户界面&#xff0c;初始化模型和用户界面。 模型导入和配置 在 Plant Overview 中导入或创建工厂布局模型。 配置路径、位置和车辆信息。 车辆连…

用DrissionPage过某里滑块分析

最近我又在找工作了&#xff0c;悲哀啊~&#xff0c;面试官给了一道题&#xff0c;要求如下&#xff1a; 爬虫机试&#xff1a;https://detail.1688.com/offer/643272204627.html 过该链接的滑动验证码&#xff0c;拿到正确的商品信息页html&#xff0c;提取出商品维度的信息&a…

排序一次讲清(从冒泡到基数)

文章目录 冒泡原理代码pythonc 选择原理代码pythonc 插入原理代码pythonc 希尔原理代码pythonc 快排原理代码pythonc 归并原理代码pythonc 堆原理代码pythonc 计数原理代码pythonc 桶原理代码pythonc 基数原理代码pythonc 【待更新】 冒泡 原理 如果我们想要让数组从左至右从…

海豚调度器(DolphinScheduler)集群搭建详细笔记

海豚调度器集群搭建笔记 1.DolphinScheduler Cluster部署1.1 集群部署规划1.2 集群准备工作1.3 初始化数据库1.4 修改安装环境配置1.5 安装DolphinScheduler1.6 启停命令1.7 登录 DolphinScheduler UI 1.DolphinScheduler Cluster部署 分布式去中心化易扩展的工作流任务调度系…

【最强八股文 -- 计算机网络】TCP 四次挥手的过程及原因

第一次挥手&#xff1a;FIN 报文第二次挥手&#xff1a;ACK 报文第三次挥手&#xff1a;FIN 报文第四次挥手&#xff1a;ACK 报文 为什么需要四次挥手&#xff1f; 为什么需要 TIME_WAIT 状态&#xff1f; TIME_WAIT 的时间为什么是 2MSL&#xff1f;

springboot服务如何执行sql脚本文件

当sql脚本文件包含不同数据库实例sql时&#xff0c;遍历读取sql文件再插入时&#xff0c;由于是不同的数据库实例这种方式就不行了&#xff0c;这时就需要程序直接执行sql脚本。 springboot执行sql脚本 /*** 执行sql脚本* throws SQLException*/ private void executeSqlScri…

go-zero框架入门

go-zero框架环境的安装 goctl 若想用go-zero框架&#xff0c;还需要一些前置条件&#xff1a; 安装goctl go install github.com/zeromicro/go-zero/tools/goctllatest可以使用 goctl 命令查看是否安装成功 成功后安装protoc goctl env check --install --verbose --force…

重生奇迹MU 三代翅膀行情

在重生奇迹MU游戏中&#xff0c;达到400级以上的玩家都知道&#xff0c;重生奇迹大陆拍卖行里最值钱的物品是翅膀。翅膀可以分为一代、二代和三代翅膀&#xff0c;而其中价格最高的则是三代翅膀。有时候&#xff0c;三代翅膀的售价非常之高&#xff0c;甚至有市无价。这是因为三…

[论文笔记] CT数据配比方法论——1、Motivation

我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…

PyTorch 深度学习实践-逻辑斯蒂回归

视频指路 参考博客笔记 参考笔记二 用来分类的模型 说明&#xff1a;1、 逻辑斯蒂回归和线性模型的明显区别是在线性模型的后面&#xff0c;添加了激活函数(非线性变换) ​ 2、分布的差异&#xff1a;KL散度&#xff0c;cross-entropy交叉熵 现在损失函数衡量不是距离而是分布…

Jmeter性能测试(九)

一、Jmeter性能测试需要特别注意的地方 1、参数化 2、请求参数 3、BeanShell 预处理程序更新jmeter请求参数 4、接口中不可重复的随机数处理 5、线程组设置 6、总结 二、参数化 1、参数化配置,多个参数用英文逗号隔开 2、wallet参数化文件,不要写表头,多个参数用英文逗号…

【YOLOv8改进[Conv]】KAN系列 |使用KACNConv改进C2f + 含全部代码和详细修改方式 + 手撕结构图

本文将进行在YOLOv8中使用KACNConv改进C2f 的实践,助力YOLOv8目标检测效果,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法。训练速度会慢一些,要有心理准备哈! 改进前和改进后的参数对比: 目录

《基于 Kafka + Quartz 实现时限质控方案》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

玳数科技集成 Flink CDC 3.0 的实践

摘要&#xff1a;本文投稿自玳数科技工程师杨槐老师&#xff0c;介绍了 Flink CDC 3.0 与 ChunJun 框架在玳数科技的集成实践。主要分为以下六个内容&#xff1a; 背景技术选型架构设计挑战与解决方案上线效果未来规划 1. 背景 玳数科技对内外部用户提供了一站式的数据开发治理…