若有两个空位,那么在上面的基础上直接不放或者隔k个0放1(因为不满足有k个0,需要特判) {0,0},{1,0},{0,1}
若有三个空位,那继续递推,直接放0,或者隔k个0放1(因为不满足有k个0,需要特判) {0,0,0} {1,0,0},{0,1,0} {0,0,1}
若有四个空位,继续按照上面的方法递推 {0,0,0,0} {1,0,0,0} {0,1,0,0} {0,0,1,0} {0,0,0,1} {1,0,0,1}
那么我们可以得到一个递推式子,dp【i】=dp【i-1】(在后面直接放0)+dp【i-k-1】(在隔k个0后放1)
如果i-k-1<1了,那么我们只需在dp【i-1】的基础上直接+1就行,因为这种情况只有一次。其余情况都是在后面直接放0.
最后我们初始化一开始的dp【1】=2即可。结果别忘了取模1e9+7
#include<bits/stdc++.h>
using namespace std;
int n,k;
const int N=1e6+9;
int mod=1e9+7;
int dp[N]; //在前i个空位有几种方案
/*
dp[i]: 表示i个空位的方案数
第i个空位,要么放;要么不放
放 :就从dp[i - k - 1]转移过来
不放 :就从dp[i - 1] 转移过来
*/
int main(){
cin>>n>>k;
dp[0]=1; //什么也不放也是一种
for(int i=1;i<=n;i++){
if(i>=k+1) //可以放多个油桶的情况
{
dp[i]=(dp[i-1]+dp[i-k-1])%mod;
}
else //最多放一个油桶的情况
dp[i]=dp[i-1]+1;
}
cout<<dp[n];
return 0;
}