本文主要是介绍动态规划(爬楼梯)-灵神题单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
2466. 统计构造好字符串的方案数
给你整数
zero
,one
,low
和high
,我们从空字符串开始构造一个字符串,每一步执行下面操作中的一种:
- 将
'0'
在字符串末尾添加zero
次。- 将
'1'
在字符串末尾添加one
次。以上操作可以执行任意次。
如果通过以上过程得到一个 长度 在
low
和high
之间(包含上下边界)的字符串,那么这个字符串我们称为 好 字符串。请你返回满足以上要求的 不同 好字符串数目。由于答案可能很大,请将结果对
109 + 7
取余 后返回。示例 1:
输入:low = 3, high = 3, zero = 1, one = 1 输出:8 解释: 一个可能的好字符串是 "011" 。 可以这样构造得到:"" -> "0" -> "01" -> "011" 。 从 "000" 到 "111" 之间所有的二进制字符串都是好字符串。示例 2:
输入:low = 2, high = 3, zero = 1, one = 2 输出:5 解释:好字符串为 "00" ,"11" ,"000" ,"110" 和 "011" 。提示:
1 <= low <= high <= 105
1 <= zero, one <= low
记忆化搜索:
class Solution {int[] arr;int zero=0;int one=0;int low=0;int high=0;public int countGoodStrings(int low, int high, int zero, int one) {this.zero=zero;this.one=one;this.low=low;this.high=high;arr=new int[high+1];Arrays.fill(arr,-1);arr[0]=1;long sum=0l;for(int i=high;i>=low;i--){sum+=(dfs(i)%1000000007);}return (int)(sum%1000000007);}public int dfs(int i){if(i<0) return 0;if(i>high) return 0;if(arr[i]!=-1) return arr[i];int answer=dfs(i-zero)+dfs(i-one);arr[i]=answer%1000000007;return answer%1000000007;}
}
动态规划:
class Solution {public int countGoodStrings(int low, int high, int zero, int one) {long[] dp=new long[high+1];dp[0]=1;for(int i=1;i<=high;i++){dp[i]=((i-zero<0?0l:dp[i-zero])+(i-one<0?0l:dp[i-one]))%1000000007;}long sum=0l;for(int i=low;i<=high;i++){sum+=dp[i]%1000000007;}return (int)(sum%1000000007);}
}
这篇关于动态规划(爬楼梯)-灵神题单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!