动态规划题目

记录一些简单的动态规划题目,待发现解题规律和方法

1、最长递增子序列

leetcode300题
题目描述:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。
例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

    public static int getMaxLength(int nums[]) {
        int len = nums.length;
        if (len < 2) return len;

        int[] dp = new int[len];
        Arrays.fill(dp, 1);
        int ans = 1;

        for (int i = 0; i < len; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[j] < nums[i]) dp[i] = Math.max(dp[i], dp[j] + 1);
            }
            ans = Math.max(ans, dp[i]);
        }

        return ans;
    }

2、找零钱问题

leetcode322题
题目描述:给定不同面额的硬币 coins 和一个总金额 amount。
编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

你可以认为每种硬币的数量是无限的。

    public static int giveChange(int[] coins, int target) {

        if (target <= 0) return -1;

        int[] dp = new int[target + 1];
        for (int i = 0; i < dp.length; i++) {
            dp[i] = i;
        }

        for (int i = 1; i <= target; i++) {
            for (int coin : coins) {
                if (i - coin < 0) continue;
                dp[i] = Math.min(dp[i], dp[i - coin] + 1);
            }
        }

        return dp[target];
    }
posted @ 2021-05-09 21:59  INEEDSSD  阅读(73)  评论(0)    收藏  举报