本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
1220.统计元音字母序列的数目
题目大意
给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串:
- 字符串中的每个字符都应当是小写元音字母(
'a','e','i','o','u') - 每个元音
'a'后面都只能跟着'e' - 每个元音
'e'后面只能跟着'a'或者是'i' - 每个元音
'i'后面 不能 再跟着另一个'i' - 每个元音
'o'后面只能跟着'i'或者是'u' - 每个元音
'u'后面只能跟着'a'
由于答案可能会很大,所以请你返回 模 之后的结果。
样例
数据规模
思路
假设。
根据题意,假如,那么就可以得到。如果n>1,简单一点,,那么此时,这个转移方程很好解释:当第2个位置是a时,它前面一个位置(即第1个位置)只能是,那么换言之假如第i个位置是a,那么第i-1个位置只能是。同理对于第i个位置是e/i/o/u都可以根据题意知道第i-1个位置可以放哪些字母,然后由转移叠加。最后答案就是,注意整个过程要取模。
代码
class Solution {
public:
//0-a 1-e 2-i 3-o 4-u
long long dp[20000+50][5],Mod=1e9+7;
int countVowelPermutation(int n) {
for(int i=0;i<=4;i++)dp[1][i]=1;
for(int i=2;i<=n;i++){
dp[i][0]=(dp[i-1][1]+dp[i-1][2]+dp[i-1][4])%Mod;
dp[i][1]=(dp[i-1][0]+dp[i-1][2])%Mod;
dp[i][2]=(dp[i-1][1]+dp[i-1][3])%Mod;
dp[i][3]=(dp[i-1][2])%Mod;
dp[i][4]=(dp[i-1][2]+dp[i-1][3])%Mod;
}
long long ans=0;
for(int i=0;i<=4;i++)ans=(ans+dp[n][i])%Mod;
return ans;
}
};