2024/08/06 每日一题
LeetCode 3129 找出所有稳定的二进制数组I
方法1:动态规划
第一步:定义 DP 数组
第二步:状态转移方程
(1)
位填了 ,从 转移,由于其尾部填 ,故可以直接转移 位填了 ,从 转移,但需要判别 填 是否合法- 如果
,则 填入 对所有方案 均是合法的 - 如果
,则 填入 对所有方案 中的部分方案是不合法的 填入 不合法,即从此方案 开始已经填入了 个
- 如果
(2)
位填了 ,从 转移,由于其尾部填 ,故可以直接转移 位填了 ,从 转移,但需要判别 填 是否合法- 如果
,则 填入 对所有方案 均是合法的 - 如果
,则 填入 对所有方案 中的部分方案是不合法的 填入 不合法,即从此方案 开始已经填入了 个
- 如果
第三步:初始化 DP 数组
(1)从第二步可知,
- 如果
,则 - 如果
, 的个数是 ,故 - 如果
; 的个数是 ,但只能连续填 个 ,故 ,其余为
(2)从第二步可知,
- 如果
,则 - 如果
, 的个数是 ,故 - 如果
; 的个数是 ,但只能连续填 个 ,故 ,其余为
class Solution {
public int numberOfStableArrays(int zero, int one, int limit) {
int MOD = 1000000007;
int[][] dp0 = new int[zero + 1][one + 1];
int[][] dp1 = new int[zero + 1][one + 1];
for(int i = 0; i <= Math.min(zero, limit); i++)
dp0[i][0] = 1;
for(int j = 0; j <= Math.min(one, limit); j++)
dp1[0][j] = 1;
for(int i = 1; i <= zero; i++) {
for(int j = 1; j <= one; j++) {
dp0[i][j] = dp1[i - 1][j] + dp0[i - 1][j];
dp0[i][j] -= i > limit ? dp1[i - 1 - limit][j] : 0;
// 因为取余后 后面的数可能比前面的数小 故此处不加上 MOD 会导致 dp0[i][j] 变为负数
dp0[i][j] = (dp0[i][j] % MOD + MOD) % MOD;
dp1[i][j] = dp0[i][j - 1] + dp1[i][j - 1];
dp1[i][j] -= j > limit ? dp0[i][j - 1- limit] : 0;
// 因为取余后 后面的数可能比前面的数小 此处不加上 MOD 会导致 dp1[i][j] 变为负数
dp1[i][j] = (dp1[i][j] % MOD + MOD) % MOD;
}
}
return (dp0[zero][one] + dp1[zero][one]) % MOD;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)