题目大意就是将长度为n的全为1的数组,将其中某些1变为0,使得没有k个以上连续的1.
dp[i][0] 表示第i位是0满足条件的个数
dp[i][1] 表示第i位时1满足条件的个数
dp[i][1] = dp[i-1][0] + dp[i-1][1]
dp[i][0] = dp[i-k][1] + dp[i-k+1][1] +.... + dp[i-1][1]
我们用队列保存后面的求和。将复杂度降到O(N).
由于有大数,我直接用python了。
[n,k] = raw_input().split()
n=int(n)
k=int(k)
dp=[]
dp.append([0,1])
a=[]
head=0
tail=0
size=0
sum = dp[0][1]
que=[]
que.append(dp[0][1])
tail+=1
for i in range(1,n+1):
b=dp[i-1][1]+dp[i-1][0]
while tail - head > k:
sum-=que[head]
head+=1
dp.append([sum,b])
sum += b
que.append(b)
tail+=1
print dp[n][0]+dp[n][1]