记f[i]为第i个坑时的方案数。f[0]=1,因为没有坑只有一种方案。
很明显每个坑有两种决策:放,或者不放。
所以f[i] = f[i - 1] * 2。
但只对于i < m成立,因为当i >= m时就要考虑爆炸的问题了。
所以当i > m时,f[i] = f[i - 1] * 2 - f[i - m - 1],这里-f[i - m - 1]代表不能放的方案数。
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll n,m,f[100];
int main()
{
scanf("%lld%lld",&n,&m);
f[0]=1;
for (int i=1;i<=n;i++)
{
f[i]=f[i-1]*2;
if (i-m-1>=0) f[i]-=f[i-m-1];
else if (i-m-1==-1) f[i]-=1;
}
printf("%lld",f[n]);
return 0;
}