Ural 1513

来源:互联网 发布:软件设计师教程最新版 编辑:程序博客网 时间:2024/06/05 15:49

PRO IS HERE


题目大意就是将长度为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=0tail=0size=0sum = dp[0][1]que=[]que.append(dp[0][1])tail+=1for i in range(1,n+1):b=dp[i-1][1]+dp[i-1][0]while tail - head > k:sum-=que[head]head+=1dp.append([sum,b])sum += bque.append(b)tail+=1print dp[n][0]+dp[n][1]


原创粉丝点击