算法求解 -- (炼码 3854 题)计算满足条件的好二进制字符串数量

news2024/11/13 17:40:05

文章目录

  • 1. 问题描述(炼码 3854 题)
  • 2. 解决方案概述
  • 3. 动态规划详解
  • 4. 代码实现
  • 5. 示例解析
  • 6. 总结


1. 问题描述(炼码 3854 题)

给定四个正整数 minLength、maxLength、zeroGroup 和 oneGroup。需要找到所有的 好二进制字符串,一个 好二进制字符串 需要满足以下条件:

  • 字符串长度在 [minLength, maxLength] 之间。
  • 对于字符串中的每块连续 0 的子串,其长度必须是 zeroGroup 的整数倍。
  • 对于字符串中的每块连续 1 的子串,其长度必须是 oneGroup 的整数倍。
  • 0 被认为是所有数字的整数倍,即对于 zeroGroup = 2,oneGroup = 3,字符串 “00” 和 “111” 可以被认为是一个好二进制字符串。

返回满足条件的好二进制字符串的数量,答案可能很大,返回对10的9次方+7取余后的结果。

2. 解决方案概述

为了高效地解决这个问题,我们可以使用 动态规划。定义 dp[i] 表示长度为 i 的好二进制字符串的数量。通过状态转移方程,我们可以逐步计算出所有满足条件的字符串数量。

3. 动态规划详解

状态定义

  • dp[i]:表示长度为 i 的好二进制字符串的数量。

状态转移方程

  • 如果在长度为 i 的字符串末尾添加 zeroGroup 个 0,则新字符串的长度为 i + zeroGroup,并且必须满足 i + zeroGroup 在 [minLength, maxLength] 范围内。
  • 如果在长度为 i 的字符串末尾添加 oneGroup 个 1,则新字符串的长度为 i + oneGroup,并且必须满足 i + oneGroup 在 [minLength, maxLength] 范围内。

初始化

  • dp[0] = 1:表示空字符串是一种有效的初始状态。

结果计算

  • 遍历所有在 [minLength, maxLength] 范围内的长度,累加对应的 dp 值。

4. 代码实现

using System;

public class Solution {
    public int CountGoodBinaryStrings(int minLength, int maxLength, int zeroGroup, int oneGroup) {
        const int MOD = 1000000007;
        int[] dp = new int[maxLength + 1];
        dp[0] = 1; // 空字符串是一种有效的初始状态

        for (int i = 0; i <= maxLength; i++) {
            if (i + zeroGroup <= maxLength) {
                dp[i + zeroGroup] = (dp[i + zeroGroup] + dp[i]) % MOD;
            }
            if (i + oneGroup <= maxLength) {
                dp[i + oneGroup] = (dp[i + oneGroup] + dp[i]) % MOD;
            }
        }

        int result = 0;
        for (int i = minLength; i <= maxLength; i++) {
            result = (result + dp[i]) % MOD;
        }

        return result;
    }

    public static void Main(string[] args) {
        Solution solution = new Solution();

        // 示例 1
        int minLength1 = 2, maxLength1 = 3, zeroGroup1 = 2, oneGroup1 = 1;
        int result1 = solution.CountGoodBinaryStrings(minLength1, maxLength1, zeroGroup1, oneGroup1);
        Console.WriteLine($"Example 1: {result1}"); // 输出: 5

        // 示例 2
        int minLength2 = 4, maxLength2 = 4, zeroGroup2 = 3, oneGroup2 = 4;
        int result2 = solution.CountGoodBinaryStrings(minLength2, maxLength2, zeroGroup2, oneGroup2);
        Console.WriteLine($"Example 2: {result2}"); // 输出: 1
    }
}

5. 示例解析

示例 1
输入:minLength = 2, maxLength = 3, zeroGroup = 2, oneGroup = 1
输出:5
解释:满足条件的好二进制字符串有 “00”, “11”, “001”, “100”, “111”。
示例 2
输入:minLength = 4, maxLength = 4, zeroGroup = 3, oneGroup = 4
输出:1
解释:满足条件的好二进制字符串只有 “1111”。

6. 总结

通过动态规划,我们可以高效地计算出满足条件的好二进制字符串的数量。动态规划的核心思想是通过状态转移方程逐步构建解,从而避免重复计算。

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

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

相关文章

ABAP:SET CURSOR FIELD设置鼠标焦点

SET CURSOR FIELD <字段名>&#xff1a;设置鼠标焦点到该字段 SET CURSOR 设置到鼠标焦点列还是行 SET CURSOR LINE 设置鼠标焦点到行 GET CURSOR field <字段名> &#xff1a;这个相对应的获取鼠标焦点得到的字段

Gitlab-执行器为Kubetnetes时的注意事项,解决DNS解析问题

一、Gitlab-Runner 这里对于Runner的理解非常重要。 具体执行ci流水线的叫执行器。执行器可以部署是shell、docker、k8s的pod.执行完任务则生命周期结束。 管理执行器的叫Gitlab-Runner。Runner则是与Gitlab Server的Ci agent.(可以简单这么理解) 二、执行器为Kubetnetes时,DN…

双向链表(带头双向循环链表)巨详解!!!

概念 本文讲述的双向链表&#xff0c;全名叫做带头双向循环链表&#xff0c;我们学习的链表总共有八种 在前文讲述单链表时所讲到的单链表&#xff0c;其实就叫做不带头单向不循环链表&#xff0c;这里的带头、不带头才是真正的头结点&#xff0c;前文中的头结点其实叫做首元素…

时序预测 | Python基于CNN-transformer时间序列预测

时序预测 | Python基于CNN-transformer时间序列预测 目录 时序预测 | Python基于CNN-transformer时间序列预测预测效果基本介绍参考资料 预测效果 基本介绍 时序预测 | Python基于CNN-transformer时间序列预测 Cnn-transformer-自适应稀疏自注意力ASSA-对比归一化contranorm预…

网站架构知识之Ansible进阶(day022)

1.handler触发器 应用场景&#xff1a;一般用于分发配置文件时候&#xff0c;如果配置文件有变化&#xff0c;则重启服务&#xff0c;如果没有变化&#xff0c;则不重启服务 案列01&#xff1a;分发nfs配置文件&#xff0c;若文件发生改变则重启服务 2.when判断 用于给ans运…

Yolo11改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码

论文介绍 CARAFE模块概述&#xff1a;本文介绍了一种名为CARAFE&#xff08;Content-Aware ReAssembly of FEatures&#xff09;的模块&#xff0c;它是一种用于特征上采样的新方法。应用场景&#xff1a;CARAFE模块旨在改进图像处理和计算机视觉任务中的上采样过程&#xff0…

常用的c++特性-->day02

c11新特性 可调用对象案例分析 可调用对象包装器语法案例可调用对象包装器作为函数参数补充&#xff1a;类型转换运算符案例 可调用对象绑定器语法格式绑定非类成员函数/变量案例1案例2案例3案例4 绑定类成员函数/变量 lambda表达式捕获列表案例1返回值案例2 --> 包装器绑定…

锐捷技能大赛—L2TP隧道与L2TP Over IPSec嵌套,并在隧道内运行OSPF

目录 总部与分支站点之间建立隧道 基础配置 配置L2TP VPN ​编辑配置L2TP Over IPSec L2TP Over IPSec隧道内运行OSPF协议 总部与分支站点之间建立隧道 拓扑如下 基础配置 R1 int g0/1 ip add 10.1.1.1 30 int g0/0 ip add 192.168.10.254 24 exit ip route 0.0.0.0 0.0…

python可视化将多张图整合到一起(画布)

这周有点事忙着&#xff0c;没时间重温刚结束的Mathurcup数学建模&#xff0c;这两天也是再看了下&#xff0c;论文还是赶紧挺烂的&#xff0c;但比国赛又有进步&#xff08;说起国赛又不得不抱怨了&#xff0c;基本其余省份都发了&#xff0c;但江西......哎&#xff09;。哎&…

网络编程、UDP、TCP、三次握手、四次挥手

一、初识网络编程 网络编程的概念&#xff1a;在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景&#xff1a;即时通信、网游对战、金融证券、国际贸易、邮件等等。 不管是什么场景&#xff0c;都是计算机和计算机之间通过网络进行…

在 Jupyter Notebook 中使用 Matplotlib 进行交互式可视化的教程

在 Jupyter Notebook 中使用 Matplotlib 进行交互式可视化的教程 引言 数据可视化是数据分析的重要组成部分&#xff0c;能够帮助我们更直观地理解数据。Matplotlib 是 Python 中最流行的绘图库之一&#xff0c;而 Jupyter Notebook 则是进行数据分析和可视化的理想环境。本文…

[单例模式]

[设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里我们接下来要谈到的是java中典型的设计模式. 而且由于设计模式比较适合有一定编程经…

STM32软件开发 —— STM32CudeMX使用优点

目 录 STM32CudeMX使用思路步骤详细 STM32CudeMX 在图形化工具STM32CudeMX出现之前&#xff0c;开发者通常是参考库驱动文件中的例程来配置芯片的&#xff0c;进行拷贝和修改等&#xff0c;为了提高开发效率&#xff0c;ST公司开发了STM32CudeMX工具&#xff0c;通过它简化了芯…

江西省补贴性线上职业技能培训管理平台(刷课系统)

江西省补贴性线上职业技能培训管理平台(刷课系统) 目的是为了刷这个网课 此系统有两个版本一个是脚本运行&#xff0c;另外一个是可视化界面运行 可视化运行 技术栈:flask、vue3 原理: 通过分析网站接口&#xff0c;对某些接口加密的参数进行逆向破解&#xff0c;从而修改请求…

Golang | Leetcode Golang题解之第546题移除盒子

题目&#xff1a; 题解&#xff1a; func removeBoxes(boxes []int) int {dp : [100][100][100]int{}var calculatePoints func(boxes []int, l, r, k int) intcalculatePoints func(boxes []int, l, r, k int) int {if l > r {return 0}if dp[l][r][k] 0 {r1, k1 : r, k…

es自动补全(仅供自己参考)

elasticssearch提供了CompletionSuggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询效率&#xff0c;对于文档中字段的类型有一些约束&#xff1a; 查询类型必须是&#xff1a;completion 字段内容是多个补全词条形成的数组 P…

ANDROIDWORLD: A Dynamic Benchmarking Environment for Autonomous Agents论文学习

这个任务是基于androidenv的。这个环境之前学过&#xff0c;是一个用来进行强化学习的线上环境。而这篇文章的工作就是要给一些任务加上中间的奖励信号。这种训练环境的优点就是动态&#xff0c;与静态的数据集&#xff08;比如说我自己的工作&#xff09;不同&#xff0c;因此…

VBA10-处理Excel的动态数据区域

一、end获取数据边界 1、基本语法 1-1、示例&#xff1a; 2、配合row和column使用 2-1、示例1 2-2、示例2 此时&#xff0c;不管这个有数值的区域&#xff0c;怎么增加边界&#xff0c;对应的统计数据也会跟着变的&#xff01; 二、end的缺陷 若是数据区域不连贯&#xff0c;则…

【FFmpeg】FFmpeg 函数简介 ③ ( 编解码相关函数 | FFmpeg 源码地址 | FFmpeg 解码器相关 结构体 和 函数 )

文章目录 一、FFmpeg 解码器简介1、解码流程分析2、FFmpeg 编解码器 本质3、FFmpeg 编解码器 ID 和 名称 二、FFmpeg 解码器相关 结构体 / 函数1、AVFormatContext 结构体2、avcodec_find_decoder 函数 - 根据 ID 查找 解码器3、avcodec_find_decoder_by_name 函数 - 根据 名称…

Linux完结

学习视频笔记均来自B站UP主" 泷羽sec",如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 【linux基础之病毒编写&#xff08;完结&#xff09;】 https://www.bilibili.com/video…