题意:三个数N,A,B,你有1,2两种数字,组合成一个长为N的数列,1没有连续A个,2没有连续B个,问有几种排列方法。
思路:DP,dp[i][j]表示i个数,末尾为j的方案个数,可以由i-a(或者是b,看j是1还是2)到i的不同于j的方案个数总和转移而来。
using namespace std;
const int maxn=50005,modn=1e9+7;
int dp[maxn][3];
int n,a,b;
int main()
{
cin>>n>>a>>b;
dp[0][1]=dp[0][2]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=min(i,a);j++)
dp[i][1]=(dp[i][1]+dp[i-j][2])%modn;
for(int j=1;j<=min(i,b);j++)
dp[i][2]=(dp[i][2]+dp[i-j][1])%modn;
}
cout<<(dp[n][1]+dp[n][2])%modn<<endl;
return 0;
}