【状态机动态规划】3129. 找出所有稳定的二进制数组 I

本文涉及知识点

动态规划汇总

LeetCode 3129. 找出所有稳定的二进制数组 I

给你 3 个正整数 zero ,one 和 limit 。
一个 二进制数组 arr 如果满足以下条件,那么我们称它是 稳定的 :
0 在 arr 中出现次数 恰好 为 zero 。
1 在 arr 中出现次数 恰好 为 one 。
arr 中每个长度超过 limit 的 子数组 都 同时 包含 0 和 1 。
请你返回 稳定 二进制数组的 总 数目。
由于答案可能很大,将它对 109 + 7 取余 后返回。
示例 1:
输入:zero = 1, one = 1, limit = 2
输出:2
解释:
两个稳定的二进制数组为 [1,0] 和 [0,1] ,两个数组都有一个 0 和一个 1 ,且没有子数组长度大于 2 。
示例 2:
输入:zero = 1, one = 2, limit = 1
输出:1
解释:
唯一稳定的二进制数组是 [1,0,1] 。
二进制数组 [1,1,0] 和 [0,1,1] 都有长度为 2 且元素全都相同的子数组,所以它们不稳定。
示例 3:
输入:zero = 3, one = 3, limit = 2
输出:14
解释:
所有稳定的二进制数组包括 [0,0,1,0,1,1] ,[0,0,1,1,0,1] ,[0,1,0,0,1,1] ,[0,1,0,1,0,1] ,[0,1,0,1,1,0] ,[0,1,1,0,0,1] ,[0,1,1,0,1,0] ,[1,0,0,1,0,1] ,[1,0,0,1,1,0] ,[1,0,1,0,0,1] ,[1,0,1,0,1,0] ,[1,0,1,1,0,0] ,[1,1,0,0,1,0] 和 [1,1,0,1,0,0] 。

提示:
1 <= zero, one, limit <= 200

动态规划

动态规划的状态表示

pre[i][j][k] 已经解决了arr的前has个元素。 以j个i结尾,整个arr包括k个0的数量。i ∈ \in [0,1] j ∈ \in [1,limit] k $
\in$[0,zero] 。
dp[i][j][k]记录 arr的前has+1个元素的状态。
空间复杂度: O(2 × \times × limit × \times × one )
不知道何种原因,总超出内存限制。 vector 换成原生数组就好了。

动态规划的转移方程

前置状态计算后置状态。三层循环枚举pre的状态,每种状态,分别枚举当前元素0和1。
确保j ∈ \in [1,limit] ,0(1)不超过zero(one)。

动态规划的初始状态

pre[0][1][1] =1 pre[1][1][0]=1 其它全为0。

动态规划的填表顺序

has从2到zero+one。i,j,k且从小到大。

动态规划分返回值

pre之和。

动态规划代码

核心代码

class Solution {
public:int numberOfStableArrays(int zero, int one, int limit) {limit++;const int MOD = 1000000007;int pre[2][201][201] = { 0 };int dp[2][201][201] = { 0 };pre[0][1][1] = 1;pre[1][1][0] = 1;auto AddSelf = [&MOD](int& i1, int i2) {i1 = (i1 + i2) % MOD;};for (int has = 1; has < zero + one; has++) {memset(dp, 0, sizeof(dp));for (int j = 1; j < limit; j++) {//以0结尾for (int k = 0; k <= zero; k++) {const int iPre = pre[0][j][k];if (0 == iPre) { continue; }if ((j + 1 < limit) && (k + 1 <= zero)) {AddSelf(dp[0][j + 1][k + 1], iPre);}if (has - k + 1 <= one) {AddSelf(dp[1][1][k], iPre);}}}for (int j = 1; j < limit; j++) {//以0结尾for (int k = 0; k <= zero; k++) {const int iPre = pre[1][j][k];if (0 == iPre) { continue; }if ((j + 1 < limit) && (has - k + 1 <= one)) {//选1AddSelf(dp[1][j + 1][k], iPre);}if (k + 1 <= zero) {AddSelf(dp[0][1][k + 1], iPre);}}}memcpy(pre, dp, sizeof(dp));}int iRet = 0;for (int i = 0; i < 2; i++) {for (int j = 1; j < limit; j++) {//以0结尾for (int k = 0; k <= zero; k++) {AddSelf(iRet, pre[i][j][k]);}}}return iRet;}
};

测试用例

template<class T>
void Assert( vector<T> v1,  vector<T> v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){assert(v1[i] == v2[i]);}
}template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}int main()
{int zero,  one,  limit;{Solution slu;zero = 1, one = 1, limit = 2;auto res = slu.numberOfStableArrays(zero, one, limit);Assert(2, res);}{Solution slu;zero = 1, one = 2, limit = 1;auto res = slu.numberOfStableArrays(zero, one, limit);Assert(1, res);}{Solution slu;zero = 3, one = 3, limit = 2;auto res = slu.numberOfStableArrays(zero, one, limit);Assert(14, res);}{Solution slu;zero = 200, one = 200, limit = 200;auto res = slu.numberOfStableArrays(zero, one, limit);Assert(587893473, res);}
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

leetCode.83. 删除排序链表中的重复元素

leetCode.83. 删除排序链表中的重复元素 代码 class Solution { public:ListNode* deleteDuplicates(ListNode* head) {auto p head;while(p){auto q p->next;while(q && p->val q->val) q q->next;if(p->next q) p p->next;else p->next …

dp背包问题

英雄联盟游戏中新出n个英雄&#xff0c;用长度为n的教组 costs 表示每个英雄的定价&#xff0c;其中 costs[i]表示第i个英雄的点券价格。假如你一共有coins点券可以用于消费&#xff0c;且想要买尽可能多的英雄并日选择英雄按costs[i]给出顺序获取。给你价格数组 costs 和金币量…

Golang | Leetcode Golang题解之第116题填充每个节点的下一个右侧节点指针

题目&#xff1a; 题解&#xff1a; func connect(root *Node) *Node {if root nil {return root}// 每次循环从该层的最左侧节点开始for leftmost : root; leftmost.Left ! nil; leftmost leftmost.Left {// 通过 Next 遍历这一层节点&#xff0c;为下一层的节点更新 Next …

Java中的线程同步:确保数据一致性和避免竞态条件

在多线程编程中&#xff0c;线程同步是保证数据一致性和防止竞态条件的关键技术。当多个线程尝试同时访问和修改同一数据资源时&#xff0c;如果没有适当的同步机制&#xff0c;程序可能会产生不可预见的结果。Java提供了多种同步工具和技术&#xff0c;以帮助开发者有效管理线…

vue3 uni-app 中小程序实现 底部tabbar 中间凸起部分 或者说自定义底部tabbar [保姆级别教程]

1、先来看一下效果 2、代码实现 我们还是在 pages.json 中正常配置我们底部的tabbar 但是需要 添加一个字段 "custom": true, //开启自定义tabBar 不填每次原来的tabbar在重新加载时都回闪现 3、 在 pages同一级 或者 里面创建一个 子组件 用来放我们的模版 4、 …

MPLS原理与配置

1.MPLS概述 &#xff08;1&#xff09;传统IP路由转发 &#xff08;2&#xff09;MPLS基本概念 ⦁ MPLS起源于IPv4&#xff08;Internet Protocol version 4&#xff09;&#xff0c;其核心技术可扩展到多种网络协议&#xff0c;包括IPv6&#xff08;Internet Protocol ver…

单片机的内存映射和重映射

内存映射 在单片机内&#xff0c;不管是RAM还是ROM还是寄存器&#xff0c;他们都是真实存在的物理存储器&#xff0c;为了方便操作&#xff0c;单片机会给每一个存储单元分配地址&#xff0c;这就叫做内存映射。 单片机的内存映射是指将外部设备或外部存储器映射到单片…

【软件设计师】——5.数据库系统

目录 5.1 基本概念 5.2 三级模式两级映射 5.3 设计过程和数据模型 5.4 关系代数 5.5 完整性约束 5.6 规范化和反规范化 5.7 控制功能 5.8 SQL语言 5.9 数据库安全 5.10 数据备份 5.11 数据库故障与恢复 5.12 数据仓库、数据挖掘和大数据 5.1 基本概念 相关术语 候选…

三分钟“手撕”顺序表与ArrayList

前言&#xff1a; 实现顺序表的代码放开头&#xff0c;供大家更好的查阅&#xff0c;每个方法都有代码的实现。 其次我会讲解Java自带的ArrayList的实例&#xff0c;扩容机制ArrayList使用方法&#xff0c;遍历以及它的优缺点。 目录 一、自己实现的顺序表 二、Java的ArrayLi…

Python | Leetcode Python题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; class Solution:def numDistinct(self, s: str, t: str) -> int:m, n len(s), len(t)if m < n:return 0dp [[0] * (n 1) for _ in range(m 1)]for i in range(m 1):dp[i][n] 1for i in range(m - 1, -1, -1):for j in range(n …

USB摄像头使用记录

USB摄像头使用记录 文章目录 USB摄像头使用记录1.概述1.1 v4l2介绍 2.使用2.1linux应用2.2linux驱动 3.调试3.1应用调试3.1.1 获取并打印摄像头参数3.1.2get_data.c 4.平台信息5.参考记录 1.概述 1.1 v4l2介绍 2.使用 2.1linux应用 2.1.1获取并打印摄像头参数 2.2linux驱动 …

【掌握递归:以斐波那契数列为例】

文章目录 前言斐波那契数列简介使用递归计算斐波那契数递归的优点与缺点优化递归算法结论 前言 递归是编程中一种强有力的技术&#xff0c;它允许一个函数调用自身来解决问题。尽管递归在初学者中可能看起来有些难以理解&#xff0c;但通过实际的例子和练习&#xff0c;它可以…

Docker快速安装SQL Server 2022

说明&#xff1a; 系统&#xff1a;Ubuntu 24.04 LTS 拉取SQL Server Docker镜像 docker pull mcr.microsoft.com/mssql/server:2022-CU12-ubuntu-22.04创建数据目录 sudo mkdir /var/mssql_data sudo chmod 777 /var/mssql_data说明&#xff1a; 权限设置为777&#xff0…

thinkphp6的请求

由于笔者是刚入门thinkphp&#xff0c;所以学习时对照thinkphp的官网&#xff0c;各位读者也可以对照官网学习。还麻烦各位笔者一键三连&#xff0c;谢谢。 1.请求对象 当前的请求对象由think\Request类负责&#xff0c;该类不需要单独实例化调用&#xff0c;通常使用依赖注入…

ubuntu下vscode的安装包

1.引言 ubuntu下面安装vscode&#xff0c;编码调用接口时可以跳到接口api的位置&#xff0c;因此在ubuntu下安装vscode还是非常有意义的。 2.下载地址 链接&#xff1a;https://pan.baidu.com/s/1j3XNmvbL574p_hYeBqO6dg?pwdryr7 提取码&#xff1a;ryr7 --来自百度网盘超…

如何应对触摸一体机触摸屏失灵问题?怎么校准?

触摸一体机是一种功能强大的设备&#xff0c;集成了电脑、电视和触摸屏等多种功能。其中&#xff0c;触摸屏是其重要组成部分之一。然而&#xff0c;当触摸屏突然失灵时&#xff0c;我们该如何应对呢&#xff1f;以下是一些建议&#xff0c;以帮助您排除问题并重新获得正常触摸…

2024 年你应该选择哪个开源大模型?

自2017年发表的论文《Attention Is All You Need》发明了Transformer架构以来&#xff0c;自然语言处理&#xff08;NLP&#xff09;取得了巨大的进展。随着2022年11月ChatGPT的发布&#xff0c;大型语言模型&#xff08;LLM&#xff09;引起了广泛关注。 你是否想在自己的用例…

通过Zerossl给IP申请免费SSL证书, 实现https ip访问

参考通过Zerossl给IP申请免费SSL证书 | LogDicthttps://www.logdict.com/archives/tong-guo-zerosslgei-ipshen-qing-mian-fei-sslzheng-shu

授权调用: 介绍 Transformers 智能体 2.0

简要概述 我们推出了 Transformers 智能体 2.0&#xff01; ⇒ &#x1f381; 在现有智能体类型的基础上&#xff0c;我们新增了两种能够 根据历史观察解决复杂任务的智能体。 ⇒ &#x1f4a1; 我们致力于让代码 清晰、模块化&#xff0c;并确保最终提示和工具等通用属性透明化…

关于指针和数组的一些经典笔试题解析

前言 大家好&#xff0c;本篇博客将为大家展示一些曾经考过的关于指针的经典笔试题&#xff0c;里面有些题目的难度还是不小的&#xff0c;所以希望大家可以认真理解&#xff1b;如果你点开了本篇博客&#xff0c;麻烦各位大佬一键三连&#xff0c;多多支持&#xff0c;感谢&a…