当前位置: 首页 > news >正文

动态规划(二)——例题

目录

Help Jimmy

题目

解题思路

神奇的口袋

题目

枚举的解法

递归的解法

动态规划的解法

滑雪

题目

解题思路

解法一

解法二


Help Jimmy

题目

        "Help Jimmy" 是在下图所示的场景上完成的游戏:

        场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。
        Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。
        设计一个程序,计算Jimmy到底地面时可能的最早时间。

输入

        第一行是测试数据的组数t(0 <= t <= 20)。每组测试数据的第一行是四个整数N,X,Y,MAX,用空格分隔。N是平台的数目(不包括地面),X和Y是Jimmy开始下落的位置的横竖坐标,MAX是一次下落的最大高度。接下来的N行每行描述一个平台,包括三个整数,X1[i],X2[i]和H[i]。H[i]表示平台的高度,X1[i]和X2[i]表示平台左右端点的横坐标。1 <= N <= 1000,-20000 <= X, X1[i], X2[i] <= 20000,0 < H[i] < Y <= 20000(i = 1..N)。所有坐标的单位都是米。
        Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。

1
3 8 17 20
0 10 8
0 10 13
4 14 3

输出

        对输入的每组测试数据,输出一个整数,Jimmy到底地面时可能的最早时间。

23
解题思路

        Jimmv跳到一块板上后,可以有两种选择,向左走,或向右走。
        走到左端和走到右端所需的时间,是很容易算的。
        如果我们能知道,以左端为起点到达地面的最短时间,和以右端为起点到达地面的最短时间,那么向左走还是向右走,就很容选择了。
        因此,整个问题就被分解成两个子问题,即Jimmv所在位置下方第一块板左端为起点到地面的最短时间,和右端为起点到地面的最短时间。
        这两个子问题在形式上和原问题是完全一致的。将板子从上到下从1开始进行无重复的编号(越高的板子编号越小,高度相同的几块板子,哪块编号在前无所谓),那么,和上面两个子问题相关的变量就只有板子的编号。

        不妨认为Jimmy开始的位置是一个编号为0,长度为0的板子假设LeftMinTime(k)表示从k号板子左端到地面的最短时间,RightMinTime(k)表示从k号板子右端到地面的最短时间,那么,求板子k左端点到地面的最短时间的方法如下:

if(板子k左端正下方没有别的板子){if( 板子k的高度 h(k) 大于Max)LeftMinTime(k) =00;elseLeftMinTime(k) h(k);
}
else if( 板子k左端正下方的板子编号是m){LeftMinTime(k) = h(k)-h(m) +Min( LeftMinTime(m) + Lx(k)-Lx(m) RightMinTime(m)+ Rx(m)-Lx(k));
}

        上面,h(i)就代表i号板子的高度,Lx(i)就代表i号板子左端点的横坐标,Rx(i)就代表i号板子右端点的横坐标。那么 h(k)-h(m)当然就是从k号板子跳到m号板子所需要的时间,Lx(k)-Lx(m) 就是从m号板子的落脚点走到m号板子左端点的时间,Rx(m)-Lx(k)就是从m号板子的落脚点走到右端点所需的时间。
        求RightMinTime(k)的过程类似。
        不妨认为Jimmy开始的位置是一个编号为0,长度为0的板子,那么整个问题就是要求LeftMinTime(0)。
        输入数据中,板子并没有按高度排序,所以程序中一定要首先将板子排序。
        时间复杂度:
        一共 n个板子,每个左右两端的最小时间各算一次O(n)
        找出板子一段到地面之间有那块板子,需要遍历板子 O(n)
        总的时间复杂度O(n2) 

神奇的口袋

题目

        有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。

输入

        输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。

3
20
20
20

输出

        输出不同的选择物品的方式的数目。

3
枚举的解法

        枚举每个物品是选还是不选,一共2的20次方种情况。

递归的解法
#include <iostream>
using namespace std;
int a[30]; int N;
int Ways(int w ,int k){//从前k种物品中选择一些,凑成体积w的做法数目if(w==0) return 1;if(k<=0) return 0;elsereturn Ways(wk-1)+Ways(w-a[k],k -1 );
}int main(){cin >> N;for(int i=1;i<=N;++i)cin >> a[i];cout << Ways(40,N);return 0;
}
动态规划的解法
#include <iostream>
using namespace std;
int a[30];  int N;
int Ways[50][50]://Ways[i][j]表示从前i种物品里凑出体积i的方法数
int main(){cin >> N;memset(Ways,0,sizeof(Ways));for( int i = 1;i <= N;++ i){cin >> a[i];I Ways[0][i]=1;}Ways[0][0] = 1;for(int w=1;w<=40; ++ W){for(int k =1;K <=N;++K){Ways[w][k]=Ways[w][k-1];if( w-a[k] >=0)Ways[w][k]+= Ways[w-a[k]][k-1];}}cout << Ways [40] [N] ;return 0;
}

滑雪

题目

        Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子

1  2  3  4  5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

        一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

输入

        输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

输出 

        输出最长区域的长度。 

25
解题思路

L(ij)表示从点(ii)出发的最长滑行长度。
一个点(ii),如果周围没有比它低的点,L(ij)=1
否则
递推公式:L(ij)等于(i.i)周围四个点中,比(ij)低,且L值最大的那个点的L值,再加1
复杂度:O(n2)

解法一

“人人为我”式递推
L(i.j)表示从点(i.j)出发的最长滑行长度。
一个点(i.j).如果周围没有比它低的点,L(i.j)=1
将所有点按高度从小到大排序。每个点的L值都初始化为1从小到大遍历所有的点。经过一个点(i.j)时,用递推公式求L(i.j)

解法二

“我为人人”式递推
L(i,j)表示从点(i,j)出发的最长滑行长度。
一个点(i.j),如果周围没有比它低的点,L(i,j)=1
将所有点按高度从小到大排序。每个点的L值都初始化为1
从小到大遍历所有的点。经过一个点(ii)时,要更新他周围的,比它高的点的L值。例如:
if H(i+1,j)>H(ij) //H代表高度
    L(i+1,j)=max(L(i+1,j),L(i,j)+1)

相关文章:

动态规划(二)——例题

目录 Help Jimmy 题目 解题思路 神奇的口袋 题目 枚举的解法 递归的解法 动态规划的解法 滑雪 题目 解题思路 解法一 解法二 Help Jimmy 题目 "Help Jimmy" 是在下图所示的场景上完成的游戏&#xff1a; 场景中包括多个长度和高度各不相同的平台。地面是…...

Node.js中判断是文件还是文件夹的多种方法

在Node.js中&#xff0c;我们经常需要判断一个路径是文件还是文件夹。Node.js提供了多种方法来实现这一功能&#xff0c;本文将详细介绍这些方法&#xff0c;并给出相应的示例代码。 一、使用fs.Stats对象 在Node.js中&#xff0c;fs模块提供了fs.stat()或fs.statSync()方法&…...

idea 如何打war包

idea 如何打war包 1.在IntelliJ IDEA中打包WAR文件&#xff0c;你可以按照以下步骤操作:1.设置项目结构:首先&#xff0c;打开IDEA&#xff0c;选择File>Project Structure(或使用快捷键CtrlAltShiftS)。在打开的窗口中&#xff0c;选择 Artifacts 选项 2.添加Web Applicat…...

米联客-FPGA程序设计Verilog语法入门篇连载-15 Verilog语法_跨时钟域设计

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本小节主要讲解Verilog语法的…...

gradio 对话界面实现支持图片、视频正常显示

参考: https://www.gradio.app/docs/gradio/chatbot 问题: gradio网页输出视频nan;图片webp显示不出来 解决方法:需要通过gradio的Video、Image包装 代码: 这里下面启动个后端vlm模型(参考:https://blog.csdn.net/weixin_42357472/article/details/141126225),前端通…...

催收业务怎么提高接通率

提高催收呼叫业务的接通率是一个综合性的任务&#xff0c;需要从多个方面进行优化。以下是一些具体的策略和建议&#xff1a; 一、优化呼叫时间与频次 1. 选择合适的呼叫时间&#xff1a;通过分析目标客户的活跃时段&#xff0c;选择他们最可能接听电话的时间进行呼叫…...

动态生成sitemaps和robots.txt文件:提升SEO与网站可爬性

本文由 ChatMoney团队出品 在现代Web开发中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是网站成功的关键因素之一。搜索引擎通过网络爬虫来索引网页&#xff0c;而sitemaps和robots.txt文件则是帮助这些爬虫更好地理解和索引网站内容的重要工具。 sitemaps简介 Sit…...

LeetCode 第二十五天 2024.8.12

1. &#xff1a;递增子序列 题目链接: 491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 应用条件&#xff1a;回溯 难点&#xff1a; 这道题的难点在于如何去重&#xff0c;肯定不能像我们在组合中去重那样对数组排序。而且我们是要对每一层进行去重&#xff0c;…...

Elasticsearch 全文查询详解

全文查询&#xff08;Full-Text Query&#xff09;是 Elasticsearch 中的核心功能之一&#xff0c;用于对非结构化文本数据进行高效检索。与结构化查询不同&#xff0c;全文查询不仅仅是简单的精确匹配&#xff0c;还包括对文本进行分析和处理&#xff0c;从而实现更复杂的搜索…...

20240810在荣品RK3588S-AHD开发板的预置Android13下挂载exFAT的256GB的TF卡

df -h mount fdisk无效 20240810在荣品RK3588S-AHD开发板的预置Android13下挂载exFAT的256GB的TF卡 2024/8/10 21:19 缘起&#xff1a;当时比较便宜96.9&#xffe5;/想看看256GB的TF卡的高速卡的效果&#xff0c;就在京东入手了3张三星的高速TF卡。最近在弄RK3588S&#xff0c…...

java基础进阶——log日志、类加载器、XML、单元测试、注解、枚举类

前言 这篇内容主要掌握的就是logback使用、理解类加载器、XML文件的编写&#xff0c;XML文档约束schema&#xff0c;用Dom4j解析XML文档&#xff0c;Xpath检索XML文档&#xff0c;完整使用Junit单元测试框架常用部分&#xff0c;注解的定义和使用&#xff0c;枚举类的定义和开发…...

《向量数据库指南》——控制Chatbot对话内容:Dopple AI的创新实践与用户体验优化

控制Chatbot对话内容:Dopple AI的创新实践与用户体验优化 在Chatbot技术日益成熟的今天,如何有效地控制对话内容,以满足用户多样化的需求,成为了开发者们关注的焦点。Dopple AI,作为一款先进的聊天机器人平台,通过其独特的交互设计和后端技术支持,为用户提供了前所未有…...

构建实时数据仓库:流式处理与实时计算技术解析

目录 一、流式处理 请求与响应 批处理 二、实时计算 三、Lambda架构 Lambda架构的缺点 四、Kappa架构 五、实时数据仓库解决方案 近年来随着业务领域的不断拓展&#xff0c;尤其像互联网、无线终端APP等行业应用的激增&#xff0c;产生的数据量呈指数级增长&#xff0c;对海量数…...

python算术表达式遗传算法

import random import operator import math# 定义可能的运算符和操作 ops {: ,-: -,*: *,/: /,sin: math.sin,cos: math.cos }# 随机生成一个表达式&#xff08;个体&#xff09; def generate_expression(depth0):if depth > 2: # 限制表达式的最大深度return str(rando…...

net.sf.jsqlparser.statement.select.SelectItem

今天一启动项目&#xff0c;出现了这个错误&#xff0c;仔细想了想&#xff0c;应该是昨天合并代码&#xff0c;导致的mybatis-plus版本冲突&#xff0c;以及分页PageHelper版本不兼容 可以看见这个我是最下边的 Caused by 报错信息&#xff0c;这个地方提示我 net .s…...

lua匹配MAC地址 正则表达式

LUA的正则表达式匹配很弱智&#xff0c;能不用lua就不要用lua。 %x表示十六进制数值 (%x%x):(%x%x):(%x%x):(%x%x):(%x%x):(%x%x)它不允许这样用&#xff1a; ((%x%x):){5}(%x%x)mac这还算好办&#xff0c;ipv4就难了&#xff0c;ipv6不可能&#xff0c;这样写下来那一串表达…...

Chainlit快速实现AI对话应用并将聊天数据的AWS S3 和 Azure Blob云服务中

自定义数据层 Literal AI 提供了最简单的方法来保存、分析和监控您的数据。 如果您正在考虑实现自定义数据层,请查看此处的示例以获取一些启发。 此外,我们非常希望看到社区主导的开源数据层实现并将其列在这里。如果您有兴趣做出贡献,请通过 Discord 与我们联系。 您需…...

浅谈性能优化(基于C++)

本文主要针对C的性能优化方法展开讨论。虽然这些方法也适用于一些其他语言&#xff0c;但由于C经常用于底层操作&#xff0c;提供了更多的优化空间&#xff1b;相比之下&#xff0c;诸如Python、Kotlin等高级语言由于其抽象程度更高&#xff0c;优化空间较少。 性能优化原理 …...

Python 报错:ModuleNotFoundError: No module named ‘Crypto‘

Crypto报错解决方案 Python 报错&#xff1a;ModuleNotFoundError: No module named Crypto前言问题解决方案 Python 报错&#xff1a;ModuleNotFoundError: No module named ‘Crypto’ 前言 Crypto是一个加密模块&#xff0c;它包含了多种加密算法&#xff0c;如 AES、DES、…...

UE(User Equipment) 和 UA(User Agent)

UE&#xff08;User Equipment&#xff09; UE 是 用户设备&#xff0c;这是一个泛指的术语&#xff0c;涵盖了所有类型的终端设备&#xff0c;例如手机、电脑、平板、智能手表等。这些设备可以连接到网络并进行通信。UE可以包含多种功能&#xff0c;包括对话&#xff08;语音…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...