✅ [Python] DP || O(N) || Explained || Simple and Clean
dp[i] represents whether position i can be reached from position 0.\n dp[i] can be True if and only if s[i] == \'0\' and sum(dp[i - maxJump : i - minJump + 1]) 
* dp[i] represents whether position i can be reached from position 0.\n* dp[i] can be True if and only if s[i] == \'0\' and sum(dp[i - maxJump : i - minJump + 1]) > 0\n* It costs too much to compute sum(dp[i - maxJump : i - minJump + 1] every time in the for loop, so we mantain curr_sum to sum the sliding window in constant time in the loop.\n* It is no need to consider dp[i - minJump] or dp[i - maxJump - 1] if i - maxJump - 1 < 0. \n\t* Because 1 <= maxJump <= len(s) - 1, that has i - minJump >  i - maxJump - 1 >=  i - len(s)\n\t* when we compute dp[i], dp[i - len(s)] = dp[i] has not updated, so dp[i] = False initially\n\t* so as other dp[i - maxJump - 1] or dp[i - minJump] are also False initially\n```\nclass Solution(object):\n    def canReach(self, s, minJump, maxJump):\n        dp, curr_sum = [True] + [False] * (len(s) - 1), 0\n        for i in range(1, len(s)):\n            curr_sum += dp[i - minJump] - dp[i - maxJump - 1]\n            dp[i] = s[i] == \'0\' and curr_sum > 0\n        return dp[-1]\n```\n**Please UPVOTE!**
['Dynamic Programming', 'Python']