LeetCode刷题-动态规划

动态规划做题思路

1.定义数组元素来表示解,并且清晰的描述数组的含义,我们习惯用一个一维数组或者二维数组,来保存历史数组,假设用一维数组 df[] 吧,那么df[i] 你能否清楚的描述是什么意思呢?
2.找出递推式,动态规划就是要利用曾经计算过的解的集合,因此递推式显得尤为重要,第一个步骤我们定义出数组的含义之后,你们df[n]和df[n-1]、df[n-2]有什么递推关系呢?
3.找出初始值。递推式递推到最后必须有初始值才能求解出问题。所以初始值也显得很为重要。

42.连续子数组的最大和

在这里插入图片描述
1.定义数组表示解:
用一个数组df来表示解,df[i]表示数组前i个元素的以nums[i]结尾的连续子数组的最大和
2.递推式:
数组下标在0-i的连续子数组的最大和是:max{0-i-1的连续子数组的最大和(数组不以nums[i]结尾),以nums[i]结尾的连续子数组的最大和)
sum = max(df[i],sum);
3.初始值
sum初始化为df[0]

1.以nums[i]结尾的最长子数组顶点和:
df[i] = df[i-1] > 0 ? df[i-1] + nums[i] :nums[i] ;
class Solution {
    public int maxSubArray(int[] nums) {
        int[] df = new int[nums.length] ;
        int sum = Integer.MIN_VALUE;
        df[0] = nums[0] ;
        sum = df[0] ;
        for(int i = 1 ; i <nums.length ; i ++ ){
            df[i] = df[i-1] > 0 ? df[i-1] + nums[i] :nums[i] ;
            sum = sum > df[i] ? sum : df[i] ;
         }
         return sum ;
    }
}

63.股票的最大利润

在这里插入图片描述
1.定义数组来表示解:
df[i]表示前i日股票的最大利润
2.递推式
df[i] = max(df[i-1],nums[i] -min) ,min表示前i-1日股票的最小值
3.初始值:df[0] = 0 , min = df[0]
在这里插入图片描述

47.礼物的最大值

在这里插入图片描述
在这里插入图片描述

14.剪绳子

在这里插入图片描述

public int cuttingRope(int n) {
    int[] dp = new int[n + 1];
    dp[1] = 1;
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j < i; j++) {
            dp[i] = Math.max(dp[i], (Math.max(j, dp[j])) * (Math.max(i - j, dp[i - j])));
        }
    }
    return dp[n];
}
#数学求解,把绳子分成长度为3的一段,解最大,如果最后余1,则根据2*2>1*3,拿1个3出来和1放在一起乘积得4
class Solution:
    def cuttingRope(self, n: int) -> int:
        if n <= 3: return n - 1
        a, b = n // 3, n % 3
        if b == 0: return int(math.pow(3, a))
        if b == 1: return int(math.pow(3, a - 1) * 4)
        return int(math.pow(3, a) * 2)

19.正则表达式的匹配

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

139.单词拆分

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

140.单词拆分

https://leetcode-cn.com/problems/word-break-ii/solution/dan-ci-chai-fen-ii-by-leetcode/

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值