DP练习题

第一题:

链接:300. 最长递增子序列 - 力扣(LeetCode)

解题思路:

题目给出条件 :无序数组

题目要求 : 最长递增子序列

返回条件 : 最长字序列长度

采用方法 :动态规划(将大问题分为小问题)

大问题 : 寻找最长子序列

小问题 : 前一个数据 < 后一个数据

边界条件 : nums == 0 return 0

创建记录数组 :dp[nums,length]

初值 : dp[0] = 1

动态方程 : dp[i] = max(dp[j] + 1);

循环 : 外循环确定当前子序列最大数值 :nums[i];

                     内循环 寻找符合子序列

             通过max找出最大dp[i];

返回最大值;

class Solution {
    public int lengthOfLIS(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int[] dp = new int[nums.length];
        int max = 1;
        dp[0] = 1;
        for(int i = 1 ; i < nums.length ; i++){
            dp[i] = 1;
            for(int j = 0 ; j < i ;j++){
                if(nums[i] > nums[j]){
                    dp[i] = Math.max(dp[i] , dp[j] + 1);
                }
            }
            max = Math.max(max,dp[i]);
        }
        
        return max;
    }
}

第二题:

链接:322. 零钱兑换 - 力扣(LeetCode)

解题思路:

题目给出条件 : 金钱可以转换的额度、需要转换的金钱总数

题目要求 : 最少找零金钱份数

返回条件 : 数量

解题方法:动态规划

解题步骤:

界限 :当总金额为0 ;找零数量为0

可找份额a[j]金钱总额(i)找零数量
1、2、50f(0) = 0
1、2、51min(f(1-1),f(1-2),f(1-5))+1 = 1
1、2、52min(f(2-1),f(2-2),f(2-5)+1 = 1
1、2、53min(f(3-1),f(3-2),f(3-5))+1 = 2

注意 : f(1-5),f(2-5)等情况肯定不符合要求、不然人家还得给你补钱

状态转移方程

        min = Math.min(f(i - a[j])+1;

接下来就按照思路敲:

class Solution {
    public int coinChange(int[] coins, int amount) {
        if(coins.length == 0) return -1;
        int[] a = new int[amount+1];
        a[0] = 0;
        for(int i = 1 ; i <= amount ; i++){
            int min = Integer.MAX_VALUE;
            for(int j = 0 ; j < coins.length ; j++){
//这里就将那些 f(1-5)的过滤掉了,如何后面判断就找最小值
                if(i - coins[j] >= 0 && a[i - coins[j]] < min){
                    min = a[i- coins[j]]+1;
                }
            }
//将最小值给f(i),下一次查到时直接使用;
            a[i] = min;
        }
        return a[amount] == Integer.MAX_VALUE ? -1 : a[amount];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

续写少年!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值