背单词

背单词

链接:https://ac.nowcoder.com/acm/contest/326/B

题目描述

winterzz1准备考4级了,现在winterzz1决定把世界上所有单词都背一遍,winterzz1发现任意一个单词最多有A个连续的元音,最多有B个连续的辅音。且单词最长长度为N,winterzz1问你在满打满算的情况他需要背多少单词???

输入描述:

首先输入一个T(T<=100),表示有T组案例,每组案例依次输入三个正整数N,A,B,N<=5000,A<=50,B<=50;

输出描述:

输出winterzz1最多需要背多少单词,结果mod(10^9+7)
 

输入

2
2 2 2
500 20 30

输出

702
175540856

备注:

元音字母为a,e,i,o,u,其余21个字母均为辅音

开三维数组,第一维为当前处理到第几个位置,第二维为重复的是元音还是辅音,第三维为重复的次数
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const long long MOD=1e9+7;
 4  
 5 int T;
 6 long long dp[5005][2][55];
 7  
 8 int main(){
 9     std::ios::sync_with_stdio(false);
10     cin>>T;
11     while(T--){
12         memset(dp,0,sizeof(dp));
13         dp[1][0][1]=5,dp[1][1][1]=21;
14         int n,a,b;
15         cin>>n>>a>>b;
16         long long ans=0;
17         for(int i=2;i<=n;i++){
18             for(int j=2;j<=a;j++){
19                 dp[i][0][j]=(dp[i-1][0][j-1]*5)%MOD;
20             }
21             for(int j=1;j<=a;j++){
22                 dp[i][1][1]=(dp[i][1][1]+dp[i-1][0][j]*21)%MOD;
23             }
24             for(int j=2;j<=b;j++){
25                 dp[i][1][j]=(dp[i-1][1][j-1]*21)%MOD;
26             }
27             for(int j=1;j<=b;j++){
28                 dp[i][0][1]=(dp[i][0][1]+dp[i-1][1][j]*5)%MOD;
29             }
30         }
31         for(int i=1;i<=n;i++){
32             for(int j=1;j<=a;j++){
33                 ans=(ans+dp[i][0][j])%MOD;
34             }
35             for(int j=1;j<=b;j++){
36                 ans=(ans+dp[i][1][j])%MOD;
37             }
38         }
39         cout<<ans<<endl;
40     }
41  
42 }
View Code

 

posted on 2019-01-19 15:04  Fighting_sh  阅读(155)  评论(0编辑  收藏  举报

导航