Leetcode 2466. 统计构造好字符串的方案数 入门dp(取模) C++实现

news/2024/10/21 14:21:53/

问题:Leetcode 2466. 统计构造好字符串的方案数

        给你整数 zero ,one ,low 和 high ,我们从空字符串开始构造一个字符串,每一步执行下面操作中的一种:

  • 将 '0' 在字符串末尾添加 zero  次。
  • 将 '1' 在字符串末尾添加 one 次。

以上操作可以执行任意次。

        如果通过以上过程得到一个 长度 在 low 和 high 之间(包含上下边界)的字符串,那么这个字符串我们称为  字符串。

        请你返回满足以上要求的 不同 好字符串数目。由于答案可能很大,请将结果对 10 + 7  取余 后返回。


算法1:记忆化搜索

代码:

class Solution {
public:int countGoodStrings(int low, int high, int zero, int one) {vector<int> memo(high + 1,-1);auto dfs = [&](auto &&dfs,int i){if(i < 0)   return 0;if(i == 0)  return 1;int& res = memo[i];if(res != -1)   return res;return res = dfs(dfs,i - zero) + dfs(dfs,i - one);};int ans = 0;for(int j = low;j <= high;j++)ans += dfs(dfs,j);return ans;}
};

加入取模操作,详见 Leetcode 50. Pow(x,n) 快速幂 取模

class Solution {
public:int countGoodStrings(int low, int high, int zero, int one) {const int MOD = 1'000'000'007;vector<int> memo(high + 1,-1);auto dfs = [&](auto &&dfs,int i){if(i < 0)   return 0;if(i == 0)  return 1;int& res = memo[i];if(res != -1)   return res;//return res = dfs(dfs,i - zero) + dfs(dfs,i - one);return res = (dfs(dfs, i - zero) + dfs(dfs, i - one)) % MOD;};int ans = 0;for(int j = low;j <= high;j++)//ans += dfs(dfs,j);ans = (ans + dfs(dfs, j)) % MOD;return ans;}
};

算法2:递推

代码:

class Solution {
public:int countGoodStrings(int low, int high, int zero, int one) {const int MOD = 1'000'000'007;vector<int> dp(high + 1); // dp[i] 表示构造长为 i 的字符串的方案数int ans = 0;dp[0] = 1; // 构造空串的方案数为 1for(int i = 1;i <= high;i++){if(i >= zero)   dp[i] = dp[i - zero];if (i >= one)  dp[i] = (dp[i] + dp[i - one]) % MOD;if (i >= low)  ans = (ans + dp[i]) % MOD;}return ans;}
};


http://www.ppmy.cn/news/1539177.html

相关文章

GaussDB 主备版本8 -数据库对象 学习

1 表空间 1.1 GaussDB自带了两个表空间&#xff1a;pg_default和pg_global 1.1.1 默认表空间pg_default&#xff1a;用来存储非共享系统表、用户表、用户表index、临时表、临时表index、内部临时表的默认表空间。对应存储目录为实例数据目录下的base目录。 1.1.2 共享表空间pg…

Java 多线程(一)—— 线程的创建与属性

线程的创建 方式一&#xff1a;继承 Thread 类&#xff0c;重写 run 方法 class MyThread extends Thread {Overridepublic void run() {System.out.println("hello Thread");} }方式二&#xff1a;实现 Runnnable 接口&#xff1a; class MyRunnable implements …

探索 MicroRabbit:Python 中的通信新纪元

文章目录 探索 MicroRabbit&#xff1a;Python 中的通信新纪元背景&#xff1a;为什么选择 MicroRabbit&#xff1f;MicroRabbit 是什么&#xff1f;如何安装 MicroRabbit&#xff1f;简单的库函数使用方法场景应用示例常见 Bug 及解决方案总结 探索 MicroRabbit&#xff1a;Py…

Git客户端使用之TortoiseGit和Git

git客户端有两个分别是TortoiseGit和Git Git用于命令行TortoiseGit用于图形界面。无论是Git还是TortoisGit都需要生成公/私钥与github/gitlab建立加密才能使用。 一、先介绍Git的安装与使用 1、下载与安装 安装Git-2.21.0-64-bit.exe(去官网下载最新版64位的)&#xff0c;安…

YUV视频数据类型

YUV视频数据类型 1. 概述2. YUV420P2.1 YU122.2 YV123. YUV420SP3.1 NV213.2 NV124. YUV 和 RGB 转换1. 概述 YUV 视频数据是根据一个亮度 Y 和两个色度 UV 来定义的颜色空间。常见的 YUV 格式有 I420,NV12,YV12。 YUV 有三种采样模式,其中: YUV 4:4:4 采样,每一个 Y 对…

洗衣店订单管理:Spring Boot技术实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

Spring Boot洗衣店订单处理:高效管理之道

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

NL2SQL之DB-GPT-Hub<详解篇>:text2sql任务的微调框架和基准对比

NL2SQL之DB-GPT-Hub<详解篇>:text2sql任务的微调框架和基准对比 随着生成式人工智能(Artificial Intelligence Generated Content,简写为 AIGC)时代的到来,使用大规模预训练语言模型(LLM)来进行 text2sql 任务的 sql 生成也越来越常见。基于 LLM 的 text2SQL 方法…