【每日一题见微知著】DP算法——零钱和问题+元音字母序列统计

本文介绍了使用动态规划(DP)方法解决LeetCode中的两道题目:1220. 统计元音字母序列的数目,通过状态转移方程求解;322. 零钱兑换,利用局部最优推导全局最优解。详细解析了题目描述、解题思路及代码实现。
摘要由CSDN通过智能技术生成

⭐️寒假新坑——代码之狐的每日做题笔记

1220. 统计元音字母序列的数目—Hard

题目描述:

给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串:

  • 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i', 'o', 'u'
  • 每个元音 'a' 后面都只能跟着 'e'
  • 每个元音 'e' 后面只能跟着 'a' 或者是 'i'
  • 每个元音 'i' 后面 不能 再跟着另一个 'i'
  • 每个元音 'o' 后面只能跟着 'i' 或者是 'u'
  • 每个元音 'u' 后面只能跟着 'a'

由于答案可能会很大,所以请你返回 模 10^9 + 7 之后的结果。

解题方法:

很基础的动态规划方法,状态为当前字母结尾的字符的可能组合数,比如长度为2的以a为结尾的组合,ea、ia、ua三个,则dp[2] [‘a’]=3;由于不需要保存中间状态,直接写为dp[‘a’]=3——由题意可知,状态的推导关系,长度为2的a结尾可以用长度为1的e、i、u结尾添加a组成,既有dp[‘a’]=pre_dp[‘e’]+pre_dp[‘i’]+pre_dp[‘u’]

在这里插入图片描述

代码实现:
class Solution {
   
    public final static int MOD=1000000000+7;
    
    public int countVowelPermutation(int n) {
   
        //状态
        int[] ans=new int[5];
        //前状态
        int[] mid=new int[5]; 
        
        //dp初始化
        for(int i=0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码之狐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值