我们设定dp[i][0/1]表示当前放了厚度为i的书,最后一本是白色还是黑色。那我们就可以推出
d
p
[
i
]
[
0
]
=
d
p
[
i
−
1
]
[
1
]
dp[i][0]=dp[i-1][1]
dp[i][0]=dp[i−1][1]和
d
p
[
i
]
[
1
]
=
d
p
[
i
−
1
]
[
0
]
+
d
p
[
i
−
h
]
[
0
]
dp[i][1]=dp[i-1][0]+dp[i-h][0]
dp[i][1]=dp[i−1][0]+dp[i−h][0]
答案就显而易见喽
不过代码是真的短
#include<bits/stdc++.h>
#define mod 998244353
using namespace std;
int l,h;
long long f[1000005][2],ans;
int main()
{
scanf("%d%d",&l,&h);
f[0][0]=1;
for(int i=1;i<=l;i++)
{
f[i][0]=f[i-1][1];
f[i][1]=f[i-1][0];
if(i>=h)
(f[i][1]+=f[i-h][0])%=mod;
(ans+=f[i][1])%=mod;
}
printf("%lld",ans);
}
来源:zr