文章目录
URL
链接:https://leetcode-cn.com/problems/count-vowels-permutation/
题目
分析
源码
DP动态规划
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef long long LL;
int countVowelPermutation(int n){
/* 0.1 */
long long mod = 1e9 + 7 ; //取模 避免数据过大
long long ans = 0; //返回值 存储最后所有的可能项的数量
LL * dp = (LL *)malloc(sizeof(LL)*5); // 前一次计算数据
LL * ndp = (LL *)malloc(sizeof(LL)*5); // 存储当前次计算数据
/* a , e , i , o , u */
/* 0 , 1 , 2 , 3 , 4 */
/* 1.1 */
/* n = 1 */
for (int i = 0;i < 5 ; i++){
dp[i] = 1;
}
/* 1.2 */
/* n >= 2 */
for (int i=2;i<=n;i++){ // Tip : i <= n
/* 1.3 */
/* e , u , i + a */
ndp[0] = (dp[1] + dp[2] + dp[4]) % mod; // n >= 2时,以各个元音结尾的数量(n为i的时候的数据)
/* a , i + e */
ndp[1] = (dp[0] + dp[2]) % mod;
/* e , o + i */
ndp[2] = (dp[1] + dp[3]) % mod;
/* i + o */
//ndp[3] = (dp[2]) % mod;
ndp[3] = dp[2]; //Tip : it is already been calculated by mod
/* i , o + u */
ndp[4] = (dp[2] + dp[3]) % mod;
/* 1.4 */
memcpy(dp , ndp , sizeof(LL)*5 ); // 将当前次各个数量赋值给下一次待计算的数值变量
}
/* 2.1 */
for (int i =0 ;i < 5 ;i++){
ans = ( ans + dp[i]) % mod;
}
/* 0.2 */
free(dp);
free(ndp);
return ans;
}
int main()
{
int n = 0;
int ans = 0;
n = 1; // -> 5
ans = countVowelPermutation(n);
printf("n = %d , len = %d\n",n,ans);
n = 2; // -> 10
ans = countVowelPermutation(n);
printf("n = %d , len = %d\n",n,ans);
n = 5; // -> 68
ans = countVowelPermutation(n);
printf("n = %d , len = %d\n",n,ans);
return 0;
}
矩阵快速幂
略
源码概述
dp动态规划
- 计算每一个字符的前一个字符可能的组合情况
- 对每一个字母的符合的状态做动态规划,即将前一种状态累加到当前状态中
- 将上述的情况做 加法 , 得到最终总的组合数量
矩阵快速幂
- 略
小结
dp动态规划
- 将当前字符当做最后一个字符分析,得到前一个字符的可能情况
- 从前一个状态分析得到当前状态,得到动态规划递推公式
- 汇总每一种分情况的数据,得到总的数据。
矩阵快速幂
- 略