regardless of previous string formulation as long as they have the same length, the decision is the same, either choose 0 or 1, that's why caches work here.
If you go backwards in the iterative solution, the result is dp[0]. However, you can't just set dp[high] = 1 and keep everything else 0. Also, in the general case, max(dp[low:high + 1]) might be > 1.
Great exoplanation as usual- java solution class Solution { Integer[] dp = null; int mod= 1000000007; private int helper(int low, int high, int zero, int one, int currLen){ if(currLen>high) return 0; if(dp[currLen]!=null) return dp[currLen]; int res=0; // if within range we wll include this string if(currLen>=low){ res=1; }else{ res=0; } res+= helper(low,high,zero,one,currLen+zero)%mod +helper(low,high,zero,one,currLen+one)%mod; dp[currLen]=res%mod; return dp[currLen]; } public int countGoodStrings(int low, int high, int zero, int one) { dp=new Integer[high+1]; return helper(low,high,zero,one,0); } }
Can we do this problem using brute force and applying permutation and combination. Because in this problem all we have to find is the combination of the good string?
Hey NeetCode or anyone reading this, I really need your help I cannot find single resource for good explanation of this problem: 2673. Make Costs of Paths Equal in a Binary Tree (It has no editorial on Leetcode) Everyone has almost used the same solution int minIncrements(int n, vector& cost) { int res = 0; function dfs = [&](int i) { if (i >= cost.size()) return 0; int a = dfs(2 * i + 1), b = dfs(2 * i + 2); res += abs(a - b); return cost[i] + max(a, b); }; dfs(0); return res; } But NOOOOO one explains clearly whyy do we have to return cost[i] + max(a, b). Any help from anyone in the comments section will be appreciated.
You explained it really well but the code in python is very different when compared to java or c++ This is my code in java ( tabulation) class Solution { int mod = 1000000007; int[] dp ; public int countGoodStrings(int low, int high, int zero, int one) { dp = new int[high + Math.max(high , low) + 5]; // filling base case array for(int i = 0 ; i < high + 5 ; i++){ if(i >= low && i high) dp[i] = 0; } for(int i = high ; i >= 0 ; i--){ int left = dp[i+ zero] % mod; int right = dp[i + one] % mod; dp[i] = dp[i]+ (left+ right) % mod; } return dp[0]; } }
Java Solution using HashMap: public int countGoodStrings(int low, int high, int zero, int one) { int mod = (int) 1e9+7; HashMap dp = new HashMap(); for(int i=high; i>=0; --i){ if(i>=low) dp.put(i, (1+dp.getOrDefault(i+zero, 0)+dp.getOrDefault(i+one, 0))%mod); else dp.put(i, (dp.getOrDefault(i+zero, 0)+dp.getOrDefault(i+one, 0))%mod); } return dp.get(0); }