无聊的小明
Descriptio
小明想用两个字母a和b创造一个长度为n的单词,但是他又不希望连续的a超过p个,同时也不希望连续的b超过q个。那么小明有能创造出多少个不用的单词呢?
Input
每组数据包括一行,三个整数n,p,q分别对应题意。
其中max(a, b) <= n <= 50000,1 <= a, b <= 300。
Output
输出不同的单词的个数。个数要对1000000007取模。
Sample Input
3 2 1
Sample Output
4
*用倒数第i位为a和b,然后分别让后面不超过对应b和a的个数
DP动态方程:
dp[i][1]+=dp[i-j][0];
dp[i][0]+=dp[i-j][1];*
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
const int mod=1e9+7;
const int N=50005;
int dp[N][2];
int main()
{
int n,p,q;
while(scanf("%d%d%d",&n,&p,&q)!=EOF)
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;///后面是a
dp[0][1]=1;///后面是b
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i&&j<=p;j++)
{
dp[i][1]+=dp[i-j][0];
dp[i][1]%=mod;
}
for(int j=1;j<=i&&j<=q;j++)
{
dp[i][0]+=dp[i-j][1];
dp[i][0]%=mod;
}
}
printf("%d\n",(dp[n][0]+dp[n][1])%mod);
}
}