斗破苍穹算法版—萧炎的成长之路(一)

2023-11-16

前言

在这里插入图片描述
「作者主页」雪碧有白泡泡
「个人网站」雪碧的个人网站
「推荐专栏」

java一站式服务
前端炫酷代码分享
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
数据流通的精妙之道

请添加图片描述

主角介绍

萧炎是一位虚构角色,出自于中国作家天蚕土豆的小说《斗破苍穹》。在小说中,萧炎是一个年轻的天才炼药师和斗气修炼者,他经历了许多困难和挑战,通过不断努力和智慧,最终成为了强大的存在。
在这里插入图片描述

动态规划

动态规划(Dynamic Programming)是一种常用的算法设计方法,它通常用于解决具有重叠子问题和最优子结构性质的问题。虽然萧炎并非现实存在人物,但我们可以他的故事与动态规划的思想联系起来,以便更好地理解动态规划的概念。

故事背景

在小说中,萧炎面临着许多困和敌人,他需要不断提升自己的实力以保护自己和身边的人。
这可以类比为动态规划中的问题,其中萧炎需要找到一条最优的路径或策略来解决问题。动态规划的核心思想是将原问题分解为若干个子问题,并保存子问题的解,避免重复计算。似地,萧炎在修炼斗和炼药过中也会遇到各种子问题,他会据自己的经验和知识来决这些问题,并将解决方案保存下来以备将来使用。
在这里插入图片描述

题目:

萧炎在修炼斗技和炼药程中需要消耗不同数量的资源,他希望通过合理安排资源的使用,使得自己的实力提升最快。已知萧炎拥有一定数量的资源,每次修炼斗技或炼药都需要消耗一定数量的资源,而每次修炼斗技或炼药所获得的实力提升也是不同的。请问,萧炎应该如何安排资源的使用,才能使得实力提升最快?

输入:

一个整数n,表示萧炎拥有的资源总量。 两个长度为n的数组a和b,分别表示修斗技和炼药过程中每次消耗的资源数量。

两个长度为n的数组c和d,分别表示修炼斗技和药过程中每次得的实力提升值。
输出一个整数,表示萧炎通过合理安排资源使用所能达到的最大实力提升值。
示例:
输入: n = 3 a = [1, 2, 3] b = [2,3, 4] c = [5, 10, 15] d = [10, 20, 30]

输出: 60

解释:
萧炎拥3个资源,每次修炼斗技和炼药过程中分别消耗1、2、3个资源。每次修炼斗技和炼药过程中分别获得10、20、30的实力提升值。为了使实力提升最快,炎可以选择使用1个资源修炼斗,使用第2个资源炼药,使用第3个资源修炼斗技。这总共消耗的资源为1+2+3=6,总共获的实力提升值为10+20+30=60,是最优的方案。

解决方案

  1. 我们可以定义一个二维数组dp,其中dp[i][j]表示在前i个资源使用j个资源时所能达到的最大实力提升值。

  2. 首先,我们需要初始化dp数组。当没有资源可用时,无论使用多资源,实力提升值都为0因此dp[0][j] = 0。当没有使用任何资源时,实力提升值也为0,dp[i][0] = 0。

  3. 然后,我们可以使用状态转移方程来更新dp数组。对于第i个资源,我们有两种选择:使用它修炼斗技或者炼药过程。如果选择修炼斗技,那么实力提升值为dp[i-1][j-1]+ c[i-1],即i-1个资源中使用j-1个资源时的最大实力提升值加上第i个资源修炼斗技所得的实力提升值。如果选择炼药过程,那么实力提升值为dp[i-1][j] + d[i-1],即前i-1个资源中使用j个资源时的最大实力提升值加上第i个资源炼药过程所得的实力提升值。我们需要取这两种选择中的较大值作为dp[i][j]的值。

  4. 最后dp[n][n]即为所求的结果,表示在n个资源中使用n个资源时所能达到的最大实力提升值。

以下是Java实现代码:

public class Main {
    public static void main(String[] args) {
        int n = 3;
        int[] a = {1, 2, 3};
        int[] b = {2, 3, 4};
        int[] c = {5, 10, 15};
        int[] d = {10, 20, 30};

        int[][] dp = new int[n + 1][n + 1];

        for (int i = 0; i <= n; i++) {
            dp[i][0] = 0;
            dp[0][i] = 0;
        }

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (j >= a[i - 1]) {
                    dp[i][j] = Math.max(dp[i - 1][j - a[i - 1]] + c[i - 1], dp[i][j]);
                }
                if (j >= b[i - 1]) {
 dp[i][j] = Math.max(dp[i - 1][j - b[i - 1]] + d[i - 1], dp[i][j]);
                }
            }
        }

        System.out.println[n][n]);
    }

状态转移方程

此外,动态规划还涉及到状态转移方程的定义。在小说中,萧炎通过不断修炼和战斗,逐渐提升自己的实。这可以看是一个状态转移过程,每状态都与前一个状态相关联。类似地,在动态规划中,我们通常定义一个状态移方程来描述问题的最优子结构,从而导出整个问题的优解。

题目

在这里插入图片描述

题目:假设萧炎在修炼过中,他可以选择进行不同的训练活动来提升自己的实力。每个训练活动都有一个对应的消耗和收益值。萧炎的目标是通过选择适当的训练活动,使得他的实力值达到最大化。请设计一个动态规划算法,计算出萧炎能够达到的最大实力值。

输入:

  • 一个整数数组costs,表示每个训练活动的消耗值,其中 costs[i] 表示第 i 个训练活动的消耗值。
  • 一个整数数组benefits,表示每个训练活动的收益值其中 benefits[i] 表示 i 个训练活动的收益值。
  • 一个整数target,表示萧炎希望达到的目标实力值。

输出:

  • 一个整数,表示萧炎能够达到的最大实力。

解决方案

以下是使用Java语言实现该动态规划问题的代码:

public class WarriorTraining {
    public static int maxStrength(int[] costs, int[] benefits, int target) {
        int n = costs.length;
        int[][] dp = new int[n + 1][target + 1];

        for (int i = 1; i <= n; i++) {
            int cost = costs[i - 1];
            int benefit = benefits[i - 1];

            for (int j = 0; j <= target; j++) {
                if (j >= cost) {
 dp[i][j] = Math.max(dp[i - 1][j],[i - 1][j - cost] + benefit);
                } else {
                    dp[i][j] = dp[i - 1][j];
                }
            }
        }

        return dp[n][target];
    }

 public static void main(String[] args) {
        int[] costs = {2, 3, 4, 5};
        int[] benefits = {3, 4, 5, 6};
        int target = 10;

        int maxStrength = maxStrength(costs, benefits, target);
        System.out.println("萧炎能够到的最大实值为: " + maxStrength);
    }
}

在上述代码中我们使用二维数组dp来记录状态转移过程。其中dp[i][j]表示在前i个训练活动中,达到实力值j所能获得的最大收益。通过遍历每个训练活动和目标实力值的组合,根据状态转移方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-cost]+benefit)更新dp数组。最终,dp[n][target]即为萧炎能够达到的最大实力值。

在给定的示例中,萧炎有4个训练活动,对应的消耗值为{2, 3, 4, 5},收益值为{3, 4, 5, 6},目标实力值为10。运行上述代码,输出结果为萧炎能够达到的最实力值为:11,表示战士可以通过选择第1个和第4个训练活动达到实力值11的最大收益。

结语

总之,虽然萧炎的故事并非真实存在,但我们可以将他的历与动态划的思想相联系,以更好地理解和应用动态规划算法。动态规划的核心思想是将复杂的问题分解为简单的子问题,并通过保存子问题的解来避免重复计算,从而找到问题的最优解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

斗破苍穹算法版—萧炎的成长之路(一) 的相关文章

  • 各类排序算法的比较总结

    排序算法是最基本最常用的算法 不同的排序算法在不同的场景或应用中会有不同的表现 我们需要对各种排序算法熟练才能将它们应用到实际当中 才能更好地发挥它们的优势 今天 来总结下各种排序算法 下面这个表格总结了各种排序算法的复杂度与稳定性 各种排
  • osgEarth的Rex引擎原理分析(一二三)osgEarth的缓存及其结构

    目标 十七 中问题43 1 缓存分两类 1 文件缓存 osgDB FileCache FileSystemCache 位于osgEarthDrivers cache filesystem FileSystemCache osgDB File

随机推荐

  • 51单片机——中断

    中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置 中断功能的存在 很大程度上提高了单片机处理外部或内部事件的能力 老版51单片机内部共有5个中断源 中断是处理器一种工作状态的描述 我们把引起中断的原因 或者能够发出中断请求信号的
  • 11-----curl命令行代替post请求带baby

    1 curl命令行代替post请求带baby 使用curl命令行代替postman在linux是非常方便的 curl H Content Type application json X POST data camera uid 123 45
  • 半虚拟化和全虚拟化的区别

    全虚拟化 Full virtualization 也称为原始虚拟化技术 是另一种虚拟化方法 该模型使用虚拟机协调客户 操作系统和原始硬件 见图2 这里 协调 是一个关键词 因为VMM在客户操作系统和裸硬件之间用于工作协调 一些受保护的指令必
  • 【nginx】静态文件处理:root和alias的区别以及try_files用法

    对于静态文件 nginx支持配置文件路径 关键字为root和alias 简介 配置系统 data www目录下有如下文件 data www file a txt b txt backup c txt d txt nginx 配置中 loca
  • 面向对象设计基本原则(举例说明)

    单一职责原则 SRP 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于把这些职责耦合在一起 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 这种耦合会导致脆弱的设计 当变化发生时 设计会遭受到意想不到的
  • 基于Qt的轻量级的Ribbon控件(Office样式UI)

    基于Qt的轻量级的Ribbon控件 Office样式UI 界面截图 它支持4种目前常见的ribbon样式在线切换 包括2种office模式 office模式是最常见的ribbon模式了 就是我们经常看到的word模式 office模式的ta
  • Rust vs Go:两者结合效果更好!

    最近看到一个程序员工资排行的图 435501份数据 调查显示 Rust 是最赚钱的 随着 Rust 的发展和它表现出的很多优点 越来越多 Gopher 开始关注 Rust 首先 Rust 没有历史包袱 集表达力 高性能 内存安全于一身 可以
  • 2022年11月7日--11月13日(ue4 tf1视频教程+cesium for ue源码CesiumUtility抄写,本周10小时,合计1737小时,剩余8263小时)

    目前 mysql 7 1 tf1 3 3 oss 12 1 蓝图反射 1 7 moba 1 5 webapp 2 4 mmoarpg 00A 04 socket 2 8 根据月计划 ue4 tf1视频教程 进度按照每天一小时时长视频 其余时
  • 博客点击率过万

    写博客有5个月了 今天一看点击率过万了 但是转载的一篇文章点击了2500多次 怎么大家喜欢看文字的东西 而不喜欢技术呢 还是我写的太烂了 2012 7 9
  • QT6+Halcon

    2020年12月8日 Qt公司正式发布了Qt 6 0 这一软件开发平台全新的主要版本 Qt 6 0 已被重新设计为面向未来 以生产力为重点的基础平台 QT迎来一个新时代 Qt Halcon这种组合在机器视觉方面应用非常广泛 一 Qt6全新理
  • C++面向对象+案例(附代码)

    C 核心编程 接上一篇 c 基础入门 文章目录 C 核心编程 1 内存分区模型 1 1 程序运行前 1 2程序运行后 1 3new操作符 2 引用 略 3 函数提高 4 类和对象 4 1封装 4 1 2struct与class区别 4 1
  • 现货交易技巧有哪些可以帮助大家

    想要在现代生活中实现资产升值 或许各种投资理财是最好的选择 但是 不管是选择哪一种 大家都需要掌握基本的一些投资技巧的 比如说现货交易 作为新兴的投资行业 大家必须要认真了解现货交易技巧 这样才可以更好地开展现货交易活动 只有现货交易基础打
  • three.js入门到实战

    学习之前 示例演示 参考资料 api查询 http www webgl3d cn threejs docs index html 代码地址 https github com mrdoob three js 学习方法讲解 对于没有基础的前端小
  • 电机与接触器小结

    目录 各类电机区别 交流 直流电机的区别 同步 异步两类电机区别 为什么会同步 为什么会不同步呢 永磁同步电机 永磁同步电机内部构造 永磁同步电机工作原理 普通 变频两类电机区别 电动机的绝缘强度问题 谐波电磁噪声与震动 低转速时的冷却问题
  • 全面认识Linux下打包解压压缩命令

    1 前言 最近通过sudo tar czf usr src tgz usr src 这个命令发现我对打包方面的命令一无所知 故正式学习记录下 这个命令动作为 将 usr src 目录下的文件打包压缩为当前路径下的usr src tgz文件
  • Explain详解与索引最佳实践

    文章目录 Explain 解释 示范表 使用语句 explain 每一列说明 id select type table type key len ref rows EXTRA 索引最佳实践 Explain 解释 示范表 DROP TABLE
  • VMware虚拟机下的CentOS7网络配置

    一 虚拟机设置 VMware界面最上面 选择虚拟机 gt 设置 将网络连接改为桥接模式 如下图所示 二 查看主机DNS地址 win R 输入cmd 启动命令行界面 输入ipconfig all 查看主机DNS服务器地址 如下图所示 三 修改
  • 基于ARM-contexA9蜂鸣器驱动开发

    上次 我们写了一个LED的驱动程序 这一节 我们只需稍微改动一下就可以实现蜂鸣器的驱动 让我们来看看吧 还是跟之前一样 先找电路图 找到电路板上对应的引脚和相关联的寄存器 1 看电路图 1 蜂鸣器接口位于电路板的底板 看电路图可知道是高电平
  • Servlet与Jsp之间有哪些数据传输的方式?

    前言 根据MVC架构大家都很清楚 servlet充当咱们mvc中的c 也就是controller 而jsp则是咱们的view 所以呀 根据它们各自的职责划分 servlet相当于是一个指挥官 将页面数据交给业务逻辑层去处理 处理后的数据也就
  • 斗破苍穹算法版—萧炎的成长之路(一)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 文章目录 前言 主