首页 > 其他分享 >Leetcode-3129 找出所有稳定的二进制数组I

Leetcode-3129 找出所有稳定的二进制数组I

时间:2024-08-11 18:27:33浏览次数:12  
标签:3129 二进制 text int zero right limit Leetcode mod

Leetcode-3129 找出所有稳定的二进制数组I

1. 题目描述

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

2. 解题思路

(1) 定义f[i][j][k]表示i个0、j个1且当前位i+j填写值为k=0/1的所有情况;
(2) 对于f[i][0][0]f[0][j][1]初始化为1,注意到:
i < = m i n ( l i m i t , z e r o ) , j < = m i n ( l i m i t , o n e ) i<=min(limit,zero),j<=min(limit,one) i<=min(limit,zero),j<=min(limit,one)
(3) 动态规划表达式:
f [ i ] [ j ] [ 0 ] = ( f [ i − 1 ] [ j ] [ 0 ] + f [ i − 1 ] [ j ] [ 1 ] + ( i > limit   ?   mod − f [ i − limit − 1 ] [ j ] [ 1 ] : 0 ) ) %  mod f[i][j][0] = \left( f[i - 1][j][0] + f[i - 1][j][1] + \left( i > \text{limit} \, ? \, \text{mod} - f[i - \text{limit} - 1][j][1] : 0 \right) \right) \% \text{ mod} f[i][j][0]=(f[i−1][j][0]+f[i−1][j][1]+(i>limit?mod−f[i−limit−1][j][1]:0))% mod

对于f[i-limit-1][j][1]表示在i+j-limit-1后存在着连续limit+1个0,这些为所有不合法情况,取mod避免结果为负数;
f [ i ] [ j ] [ 1 ] = ( f [ i ] [ j − 1 ] [ 0 ] + f [ i ] [ j − 1 ] [ 1 ] + ( j > limit ? mod − f [ i ] [ j − limit − 1 ] [ 0 ] : 0 ) ) % mod f[i][j][1] = \left( f[i][j - 1][0] + f[i][j - 1][1] + \left( j > \text{limit} ? \text{mod} - f[i][j - \text{limit} - 1][0] : 0 \right) \right) \% \text{mod} f[i][j][1]=(f[i][j−1][0]+f[i][j−1][1]+(j>limit?mod−f[i][j−limit−1][0]:0))%mod

(3) 最终结果值为
( f [ zero ] [ one ] [ 0 ] + f [ zero ] [ one ] [ 1 ] ) % mod \left( f[\text{zero}][\text{one}][0] + f[\text{zero}][\text{one}][1] \right) \% \text{mod} (f[zero][one][0]+f[zero][one][1])%mod

3. 代码实现

const long long mod = 1000000007;
class Solution {
public:
    int numberOfStableArrays(int zero, int one, int limit) {
        // f[i][j][k]表示i个0、j个1且当前位i+j填写值为k=0/1
        vector<vector<vector<long long>>> f(
            zero + 1, vector<vector<long long>>(one + 1, vector<long long>(2)));
        // 连续limit+1个数字中不能只含有0或1,即至多有连续limit个0/1
        for (int i = 1; i <= min(zero, limit); i++) {
            f[i][0][0] = 1;
        }
        for (int j = 1; j <= min(one, limit); j++) {
            f[0][j][1] = 1;
        }
        for (int i = 1; i <= zero; i++) {
            for (int j = 1; j <= one; j++) {
                // 减去包含的不合法方案
                f[i][j][0] = (f[i - 1][j][0] + f[i - 1][j][1] +
                              (i > limit ? mod - f[i - limit - 1][j][1] : 0)) %
                             mod;
                f[i][j][1] = (f[i][j - 1][0] + f[i][j - 1][1] +
                              (j > limit ? mod - f[i][j - limit - 1][0] : 0)) %
                             mod;
            }
        }
        return (f[zero][one][0] + f[zero][one][1]) % mod;
    }
};

标签:3129,二进制,text,int,zero,right,limit,Leetcode,mod
From: https://blog.csdn.net/qewa132/article/details/140947510

相关文章

  • Leetcode-3132 找出与数组相加的整数II
    Leetcode-3132找出与数组相加的整数II1.题目描述2.解题思路3.代码实现1.题目描述3132找出与数组相加的整数II2.解题思路(1)排序后,注意到nums1数组比nums2数组多两个元素,可推出最小匹配元素一定在nums[0]、nums[1]、nums[2]中出现;(2)优先从nums[2]进行判......
  • 「LeetCode Top100」之滑动窗口
    3.无重复字符的最长子串题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-100-liked题目难度:中等标签:哈希表、字符串、滑动窗口题目状态:学习题解思路:滑动窗口的思路,也就是维持一个无......
  • 操作符详解(内含二进制与原、反、补码知识点)--还有超详细图解!一看就会!
    前言今天给大家分享一下C语言操作符的详解,但在此之前先铺垫一下二进制和进制转换与原码、反码、补码的知识点,都有详细的图解,也希望这篇文章能对大家有所帮助,大家多多支持呀!目录前言一、二进制和进制转换1.  10进制转化为10进制​2.  2进制转化为10进制 ​2.......
  • Linux:@2024-08-10 最新的Openssl-3.3.1 Openssh-9.8p1 Centos7上的编译后二进制 一键
     附件:Portable_Openssl-Openssh9.8p1-bin-el7.v1.2.1.tgz.zip特点:适用于centos7.x 已经编译为二进制对老版本的关键二进制文件sshd、sftp、scp、openssl进行了备份升级前,自动打开一个端口为2222的老版本的sshd服务,你可以连接那个2222的服务,以防死翘翘。对sshd_config进......
  • LeetCode 算法:最小栈 c++
    原题链接......
  • 「LeetCode Top100」之双指针
    283.移动零题目链接:https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked题目难度:简单标签:数组、双指针题目状态:AC思路:两个指针,i用来找0,j用来找非0。当nums[i]==0&&nums[j]!=0时,将两者交换。代码:classSolutio......
  • Leetcode 206. 反转链表
    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[]提示: 链表中节点的数目范围是 [0,5000]-5000<=Node.val<=5000方法一: //双指......
  • LeetCode | 20 ValidParentheses
    分析括号成对出现,键值对类型括号字符序列嵌套出现,不能错位,顺序具有对称性为什么不用数组这种数据结构来记录数量?因为这种方法不能保证括号的正确顺序。例如,字符串'({[)}]'会被认为是有效的。栈解决有效括号问题当遇到一个左括号时,我们需要记住它,以便在后续遇到相应的右括......
  • LeetCode | 225 Implement Stack Using Queues
    分析阻塞(Blocking)阻塞操作指的是在调用一个函数或方法时,如果该操作不能立即完成(例如,因为需要等待某个事件的发生,如数据达到或资源可用),那么当前线程或进程会被挂起(暂停执行),直到操作完成为止。在这个等待期间,线程或进程无法执行其他任务。等待:调用方必须等待操作完成独......
  • leetcode-12 字符串
    12.2字符串比较242有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。//解法1:排序后逐个比较字符boolisAnagram(strings,stringt){if(s.length()......