首页 > 编程语言 >算法训练——剑指offer(动态规划算法)摘要

算法训练——剑指offer(动态规划算法)摘要

时间:2023-04-04 19:37:05浏览次数:52  
标签:return offer int max 摘要 算法 array public dp


摘要

一、动态规划原理与解题方法

二、动态规划算法练习题目

2.1 跳台阶问题

算法训练——剑指offer(动态规划算法)摘要_Math

package 动态规划算法;

import org.junit.Test;

/**
 * @Classname JZ69跳台阶问题
 * @Description TODO
 * @Date 2022/2/11 18:54
 * @Created by xjl
 */
public class JZ69跳台阶问题 {
    /**
     * @description 
     * 1、题解一分析出本题f(n)可以拆分出重叠子问题f(n-1)、f(n-2);
     * 2、f(n)=f(n-1)+f(n-2)是动态规划的状态转移方程;
     * 3、f(0)=1,f(1)=1是动态规划的初始状态;
     * 4、dp为一维数组,其中dp[i]的值代表青蛙跳第n个台阶的方法数;
      * @param: target
     * @date: 2022/2/12 8:12
     * @return: int
     * @author: xjl
    */
    public int jumpFloor(int target) {
        if (target<=2){
            return target;
        }
        int[] array=new int[target];
        array[0]=1;
        array[1]=2;
        for (int i=2;i<target;i++){
            array[i]=Math.max(array[i],array[i-2]+array[i-1]);
        }
        return array[target-1];
    }


    @Test
    public void test(){
        int i = jumpFloor(7);
        System.out.println(i);
    }
}

2.2 股票问题

2.3 小偷问题

2.4 连续数组最大和问题

package 动态规划算法;

import org.junit.Test;

import java.util.Arrays;

/**
 * @Classname JZ42连续子数组的最大和
 * @Description f(n)=Math.max(f(n-1)+dp(n),dp(n))
 * @Date 2022/2/11 18:56
 * @Created by xjl
 */
public class JZ42连续子数组的最大和 {

    public int FindGreatestSumOfSubArray(int[] array) {
        int[] arr = new int[array.length];
        int max = array[0];
        arr[0] = array[0];
        for (int i = 1; i < array.length; i++) {
            arr[i] = Math.max(array[i] + arr[i - 1], array[i]);
            max = Math.max(max, arr[i]);
        }
        return max;
    }

    public int FindGreatestSumOfSubArray2(int[] array) {
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            array[i] = Math.max(array[i] + array[i - 1], array[i]);
            max = Math.max(max, array[i]);
        }
        return max;
    }


}

2.5 礼物最大问题(背包问题)

2.6 最长子串问题

2.7 数字翻译字符串

算法训练——剑指offer(动态规划算法)摘要_Math_02

算法训练——剑指offer(动态规划算法)摘要_Test_03

package 动态规划算法;

/**
 * @Classname JZ46把数字翻译成字符串
 * @Description TODO
 * @Date 2022/2/12 15:39
 * @Created by xjl
 */
public class JZ46把数字翻译成字符串 {

    /**
     * @description 这个的是有效的IP
     * @param: null
     * @date: 2022/2/12 15:39
     * @return:
     * @author: xjl
     */

    public int solve(String nums) {
        if(nums.length() == 0 || nums.charAt(0) == '0'){
            return 0;
        }
        int[] dp = new int[nums.length()];
        dp[0] = 1;
        for(int i = 1; i < dp.length; i++){
            if(nums.charAt(i) != '0'){
                dp[i] = dp[i-1];
            }
            int num = (nums.charAt(i-1)-'0')*10 + (nums.charAt(i)-'0');
            if(num >= 10 && num <= 26){
                if(i == 1){
                    dp[i] += 1;
                }else{
                    dp[i] += dp[i-2];
                }
            }
        }
        return dp[nums.length()-1];
    }
}

2.8 斐波那契数列

package 动态规划算法;

import org.junit.Test;

/**
 * @Classname JZ10斐波那契数列
 * @Description TODO
 * @Date 2022/2/11 18:54
 * @Created by xjl
 */
public class JZ10斐波那契数列 {
    /**
     * @description 动态规划
     * @param: n
     * @date: 2022/2/11 20:44
     * @return: int
     * @author: xjl
     */
    public int Fibonacci(int n) {
        if (n < 2) {
            return n;
        }
        int[] result = new int[n + 1];
        result[0] = 0;
        result[1] = 1;
        for (int i = 2; i < result.length; i++) {
            result[i] = result[i - 2] + result[i - 1];
        }
        return result[n];
    }

    /**
     * @description 递归方式
     * @param: n
     * @date: 2022/2/11 20:45
     * @return: int
     * @author: xjl
     */
    public int Fibonacci2(int n) {
        if (n < 2) {
            return n;
        }
        int res = Fibonacci2(n - 1) + Fibonacci2(n - 2);
        return res;
    }


    @Test
    public void test(){
        int i = Fibonacci2(4);
        System.out.println(i);
    }
}

博文参考

灵茶山艾府的个人空间-灵茶山艾府个人主页-哔哩哔哩视频

动态规划入门:从记忆化搜索到递推【基础算法精讲 17】_哔哩哔哩_bilibili

标签:return,offer,int,max,摘要,算法,array,public,dp
From: https://blog.51cto.com/u_13643065/6169268

相关文章

  • LeetCode——贪心算法总结
    贪心算法的主要的解题目的思路是: 860.柠檬水找零这道题算是生活中很常见的一道题,对于每一个顾客如果我们都有足够的零钱给他找零,那么就返回true,只要有一个顾客没有足够的零钱找给他就返回false。顾客只能有3种纸币,5元,10元,20元。我们要统计5元和10元的数量,20元的不需要统计,因为20......
  • 最全综述 | 图像分割算法
    图像分割是计算机视觉研究中的一个经典难题,已经成为图像理解领域关注的一个热点,图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一。所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相......
  • 如何基于AI算法实现智慧工厂视频大数据智能预警平台搭建?
    当前我国正处于数字经济高速发展的时代,企业正面临着数字化“转型升级”的需求。那么,工厂该如何实现智能化转型目标呢?EasyCVR视频融合平台与AI智能分析网关,融合了边缘AI智能识别技术,部署了多种AI算法,能实现人脸、人体、车辆、物体、行为等智能检测,在工厂的智慧转型场景中发挥着重要......
  • 树:剑指 Offer 54. 二叉搜索树的第k大节点
    题目描述:给定一棵二叉搜索树,请找出其中第k大的节点的值。 示例1:    示例2:    解题思路:本文解法基于此性质:二叉搜索树的中序遍历为递增序列。•根据以上性质,易得二叉搜索树的中序遍历倒序为递减序列。•因此,求“二叉搜索树第k大......
  • 第三届人工智能,大数据与算法国际学术会议 (CAIBDA 2023)
    第三届人工智能,大数据与算法国际学术会议(CAIBDA2023)​大会官网:http://www.caibda.org/大会时间:2023年6月16-18日大会地点:中国郑州截稿日期:2023年6月10日接受/拒稿通知:投稿后1周内提交检索:EICompendex,Scopus往届检索记录:CAIBDA2021| IEEEXplore | EICompende......
  • 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法
    DAY10共2题:月月给华华出题华华给月月出题难度较大。......
  • 4.4学习总结(虚拟试衣算法初步框架构思)
    昨天上台演示了项目框架并且讲述了未来对项目规划的构思,我们组是最后一组,整体等待过程还是很煎熬的比我们队优秀的作品有很多,所以还是很有压力的不过我们会尽力在接下来的时间内,争取完成所介绍的所有功能......
  • 算法训练——剑指offer(模拟算法)
    摘要一、模拟算法原理与解题方法二、模拟算法练习题目2.1顺时针打印矩阵顺时针打印矩阵_牛客题霸_牛客网解题思路:递归的思想和非递归的思想相差不大,递归是首先打印最外层的元素,将内层的矩阵作为一个全新的矩阵进行递归。对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当......
  • 算法训练——剑指offer(排序算法)摘要
    摘要一、排序算法原理与解题方法二、排序算法练习题目2.1数组中重复的数字数组中重复的数字_牛客题霸_牛客网package排序算法;importjava.util.ArrayList;/***@ClassnameJZ3数组中重复的数字*@DescriptionTODO*@Date2022/2/49:20*@Createdbyxjl*/publi......
  • 算法从入门到精通:选择排序
    一、排序和算法排序是算法中的一部分,也叫排序算法。算法一般用来处理数据,而数据的处理最好是要找到他们的规律,这个规律中有很大一部分就是要进行排序,所以需要有排序算法。本节讲解的是选择排序,从选择排序开始认识排序的一些基础概念。之所以将选择排序作为排序的入门,原因是选择排......