【LeetCode】动态规划—2466. 统计构造好字符串的方案数(附完整Python/C++代码)

动态规划—2466. 统计构造好字符串的方案数

  • 题目描述
  • 前言
  • 基本思路
    • 1. 问题定义
      • 举例:
    • 2. 理解问题和递推关系
      • 动态规划思想:
      • 状态定义:
      • 状态转移方程:
      • 边界条件:
    • 3. 解决方法
      • 动态规划方法
      • 伪代码:
    • 4. 进一步优化
    • 5. 小总结
  • Python代码
    • Python代码解释
  • C++代码
    • C++代码解释
  • 总结

题目描述

在这里插入图片描述

前言

在本问题中,我们需要计算构建良好字符串的方式。给定两个整数 lowhigh,表示字符串的最小和最大长度,以及两个字符 zeroone,我们的任务是找到用这两个字符构建字符串的所有可能方式,确保构建的字符串长度在 lowhigh 之间。


基本思路

1. 问题定义

我们需要找出所有由字符 01 组成的字符串,其长度在 lowhigh 之间,并且字符串的构建方式是根据提供的字符构建。

举例:

  • 输入:low = 3, high = 3, zero = "0", one = "1"
  • 输出:1
  • 解释:只有一种可能的字符串:"111",长度在范围内。

2. 理解问题和递推关系

动态规划思想:

我们可以使用动态规划来计算构建字符串的方式。定义一个数组 dp[i],表示构建长度为 i 的字符串的方式。

状态定义:

  • dp[i] 表示构建长度为 i 的字符串的方式数量。

状态转移方程:

  • 对于每个长度 i,我们可以从长度 i-1 的字符串添加字符 1,或者从长度 i-2 的字符串添加字符 0
    d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i] = dp[i - 1] + dp[i - 2] dp[i]=dp[i1]+dp[i2]
    • 其中 dp[i - 1] 是从长度 i-1 加上字符 1 的构建方式,dp[i - 2] 是从长度 i-2 加上字符 0 的构建方式。

边界条件:

  • dp[0] = 1:表示构建长度为 0 的字符串有 1 种方式(即空字符串)。
  • dp[1] = 1:表示构建长度为 1 的字符串只有 1 种方式(即字符 1)。

3. 解决方法

动态规划方法

  1. 初始化:创建一个大小为 high + 1dp 数组,初始时 dp[0] = 1dp[1] = 1
  2. 状态转移:遍历从 2high,更新 dp[i] 的值。
  3. 结果计算:将 dp 数组中 lowhigh 的所有值相加,得到构建的总方式。

伪代码:

initialize dp array with dp[0] = 1, dp[1] = 1
for i from 2 to high:dp[i] = dp[i - 1] + dp[i - 2]
total_ways = sum(dp[i] for i in range(low, high + 1))
return total_ways

4. 进一步优化

  • 时间复杂度:时间复杂度为 O(high),因为我们只需遍历到 high
  • 空间复杂度:空间复杂度为 O(high),因为需要一个 dp 数组。

5. 小总结

  • 递推思路:通过动态规划逐步构建 dp 数组,从最小长度开始递推,计算出构建的所有方式。
  • 时间复杂度:时间复杂度为 O(high),适合处理中等规模的输入。

以上就是统计构造好字符串的方案数问题的基本思路。


Python代码

class Solution:def countGoodStrings(self, low: int, high: int, zero: int, one: int) -> int:MOD = 10**9 + 7# dp[i] 表示长度为 i 的良好字符串的数量dp = [0] * (high + 1)dp[0] = 1  # 空字符串的方式for i in range(1, high + 1):if i >= one:dp[i] = (dp[i] + dp[i - one]) % MOD  # 添加字符 '1'if i >= zero:dp[i] = (dp[i] + dp[i - zero]) % MOD  # 添加字符 '0'# 计算从 low 到 high 的总和total_ways = sum(dp[i] for i in range(low, high + 1)) % MODreturn total_ways

Python代码解释

  1. 初始化:定义 dp 数组,dp[i] 表示构建长度为 i 的字符串的方式,初始时 dp[0] = 1
  2. 动态规划递推:遍历长度 1high,更新 dp[i],即计算出当前长度 i 的字符串的构建方式。
  3. 结果计算:求和 lowhigh 的所有方式,返回结果。

C++代码

class Solution {
public:int countGoodStrings(int low, int high, int zero, int one) {const int MOD = 1e9 + 7;// dp[i] 表示长度为 i 的良好字符串的数量vector<long long> dp(high + 1, 0);dp[0] = 1;  // 空字符串的方式for (int i = 1; i <= high; ++i) {if (i >= one) {dp[i] = (dp[i] + dp[i - one]) % MOD;  // 添加字符 '1'}if (i >= zero) {dp[i] = (dp[i] + dp[i - zero]) % MOD;  // 添加字符 '0'}}// 计算从 low 到 high 的总和long long total_ways = 0;for (int i = low; i <= high; ++i) {total_ways = (total_ways + dp[i]) % MOD;}return total_ways;}
};

C++代码解释

  1. 初始化:定义 dp 数组,dp[i] 表示构建长度为 i 的字符串的方式,初始时 dp[0] = 1
  2. 动态规划递推:遍历长度 1high,更新 dp[i],即计算出当前长度 i 的字符串的构建方式。
  3. 结果计算:求和 lowhigh 的所有方式,返回结果。

总结

  • 核心思想:通过动态规划计算构建字符串的方式,使用状态转移方程 dp[i] = dp[i-1] + dp[i-2] 来更新每个长度的构建方式。
  • 时间复杂度:时间复杂度为 O(high),因为只需遍历到 high
  • 空间复杂度:空间复杂度为 O(high),因为需要一个 dp 数组。

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

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

相关文章

MATLAB图像检索系统

MATLAB图像检索系统应用背景 基于内容的图像检索&#xff08;CBIR&#xff09;是一个非常热门的研究领域。本文在对颜色特征、形状特征和纹理特征的研究基础上&#xff0c;将三种特征结合在一起&#xff0c;实现了可以自定义权重的综合特征的图像检索系统&#xff0c;并在 平…

推动AI技术研发与应用,景联文科技提供专业高效图像采集服务

景联文科技提供专业图像采集服务&#xff0c;涵盖多个领域的应用需求。 包含人体图像、人脸图像、手指指纹、手势识别、交通道路、车辆监控等图像数据集&#xff0c;计算机视觉图像数据集超400TB&#xff0c;支持免费试采试标。 高质量人像采集服务&#xff1a;支持不同光线条件…

网络知识总结

osi七层模型 osi七层模型分为&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层&#xff0c;物理层 应用层&#xff1a;客户端与服务端之间建立一个通话界面表示层&#xff1a;对数据进行语言转换&#xf…

【Unity】Unity Shader学习笔记(八)基础纹理2:高度纹理、法线纹理、模型空间下的法线纹理、切线空间下的法线纹理光照计算

文章目录 凹凸映射法线纹理设置高度纹理&#xff08;Height Map&#xff09;法线纹理&#xff08;Normal Map&#xff09;模型空间的法线纹理切线空间的法线纹理优劣对比 切线空间下的法线纹理光照计算最终效果完整代码TANGENT语义内置宏 TANGENT_SPACE_ROTATIONObjSpaceLightD…

028.魔改浏览器-抓取closed的shadowRoot下的内容

一、什么是Shadow DOM Shadow DOM是一种在web开发中用于封装HTML标记、样式和行为的技术&#xff0c;以避免组件间的样式和脚本冲突。它允许开发者将网页的一部分隐藏在一个独立的作用域内&#xff0c;从而实现更加模块化和可维护的代码结构 二、js操作Shadow DOM // 获取宿…

【火山引擎】AIGC图像风格化 | 风格实践 | PYTHON

目录 1 准备工作 2 实践 代码 效果图 1 准备工作 ① 服务开通 确保已开通需要访问的服务。您可前往火山引擎控制台,在左侧菜单中选择或在顶部搜索栏中搜索需要使用的服务,进入服务控制台内完成开通流程。

云手机:社交平台运营的热门工具

随着互联网的飞速发展&#xff0c;社交平台已经成为企业推广和营销的核心渠道。传统的运营方式已经无法满足高效运营的需求&#xff0c;而云手机作为新兴工具&#xff0c;逐渐成为社交平台运营的前沿趋势。本文将深入分析云手机如何优化社交平台的运营流程&#xff0c;助力企业…

足浴店+闸机+智能衣柜+门票系统一体化管理系统解决方案——未来之窗行业应用跨平台架构

一、足浴店收银台 二、智能柜子 三、智能闸机 在收银台开台后&#xff0c;直接通过手环开闸机 1. 提高效率&#xff1a;减少了顾客等待人工操作闸机的时间&#xff0c;能够快速进入店内&#xff0c;提升顾客的进店体验。 2. 便捷服务&#xff1a;无需繁琐的钥匙或卡片&#xf…

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑&#xff0c;如何跳过联网激活&#xff1b;由于微软限制必须要联网激活&#xff0c;需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用&#xff0c;Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

LLM:reward-model-deberta-v3-large-v2模型结构

https://hf-mirror.com/OpenAssistant/reward-model-deberta-v3-large-v2是在做合成数据的质量打分时的奖励模型。 模型依托deberta-v3-large-v2编码模型&#xff0c;给定一个qa对&#xff0c;能够给出一个分数来衡量qa对的质量。没有公开训练细节&#xff0c;由于模型的输出层…

llama.cpp 去掉打印,只显示推理结果

llama.cpp 去掉打印&#xff0c;只显示推理结果 1 llama.cpp/common/log.h #define LOG_INF(...) LOG_TMPL(GGML_LOG_LEVEL_INFO, 0, __VA_ARGS__) #define LOG_WRN(...) LOG_TMPL(GGML_LOG_LEVEL_WARN, 0, __VA_ARGS__) #define LOG_ERR(…

基于微信小程序的电影交流平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

毕业设计选题:基于Hadoop的热点新闻分析系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 新闻类型管理 主题标签管理 热点新闻管理 新闻…

回归预测|时序预测|基于灰狼优化时域卷积TCN结合Transformer的多特征输入单输出的回归预测和多维时序预测Matlab程序

回归预测|时序预测|基于灰狼优化时域卷积TCN结合Transformer的多特征输入单输出的回归预测和多维时序预测Matlab程序 文章目录 一、基本原理一、基本概念二、原理和流程三、优势与应用四、总结 二、实验结果三、核心代码四、代码获取五、总结 回归预测|时序预测|基于灰狼优化时…

深度学习--CNN实现猫狗识别二分类(附带下载链接, 长期有效)

1. 代码实现(包含流程解释) 样本量: 8005 # # 1.导入数据集(加载图片)数据预处理# 进行图像增强, 通过对图像的旋转 ,缩放,剪切变换, 翻转, 平移等一系列操作来生成新样本, 进而增加样本容量, # 同时对图片数值进行归一化[0:1] from tensorflow.keras.preprocessing.image …

ADC在STM32F1系列的使用详解

目录 1. ADC简介 2. 逐次逼近型ADC&#xff08;ADC0809&#xff09; 3. ADC框图&#xff08;STM32&#xff09; 4. ADC基本结构 5. 输入通道 6. 转换模式 6.1 单次转换 6.1.1 非扫描模式 6.1.2 扫描模式 6.2 连续转换 6.2.1 非扫描模式 6.2.2 扫描模式…

计算机网络—静态路由

1.0 网络拓扑结构 星型拓扑结构是一个中心&#xff0c;多个分节点。它结构简单&#xff0c;连接方便&#xff0c;管理和维护都相对容易&#xff0c;而且扩展性强。网络延迟时间较小&#xff0c;传输误差低。中心无故障&#xff0c;一般网络没问题。中心故障&#xff0c;网络就出…

Android 内存优化——常见内存泄露及优化方案

看到了一篇关于内存泄漏的文章后&#xff0c;就想着分享给大家&#xff0c;最后一起学习&#xff0c;一起进步&#xff1a; 如果一个无用对象&#xff08;不需要再使用的对象&#xff09;仍然被其他对象持有引用&#xff0c;造成该对象无法被系统回收&#xff0c;以致该对象在…

汽车开发流程管理工具赋能安全与质量

随着数字化、人工智能、自动化系统及物联网技术的迅速发展&#xff0c;工程驱动型企业正面临重大转型挑战&#xff0c;亟需加速并深化其变革步伐。众多企业正试图通过采用基于模型的系统工程(MBSE)、产品线工程(PLE)、ASPICE、安全、网络安全、软件定义汽车、敏捷和精益开发实践…

漏洞挖掘JS构造新手向

前置思路文章 JS逆向混淆前端对抗 油猴JS逆向插件 JS加解密之mitmproxy工具联动Burp JS挖掘基础 伪协议 JavaScript伪协议是一种在浏览器中模拟网络请求的方法。它使用window.XMLHttpRequest对象或fetch()方法来模拟发送HTTP请求&#xff0c;而不是通过实际的网络请求来获…