动态规划——在做题中理解你的美

从斐波那契数列理解动态规划 一提到动态规划,大多数人都想到许许多多高端的名词,如什么状态转移方程什么的;要不就想到教材书上严谨而又晦涩难懂的对于动态规划的介绍;也有人想到高中的通项公式或数列题等等。然后脑子就开始晕了,感觉其他的入门算法都可以理解,但是到了动态规划就好难学会,也不禁产生出一种挫败的念头。不过别急,本人用我掌握动态规划的历程带你理解动态规划,让你成功进入动态规划的领域。 在使用动态规划前,先了解为什么使用动态规... 阅读详情

一、求数组最大子数组和
子数组必须是连续的,数组中可能包含有:正整数,零,负整数三种中的一种或多种。
方法一:可以用普通的方法枚举所有的连续子数组,然后求出最大的子数组和,时间复杂度为O(n*n)。
方法二:动态规划!
方法一代码:

int MaxSubString(int[] A, int n)
{
  int max = min;  //初始值为负无穷大
  int sum;
  for(int i = 0; i < n; i++)
  {
    sum = 0;
    for(int j = i; j < n; j++)
    {
      sum += A[j];
      if(sum > max)
        max = sum;
    }
  }
  return max;
}

方法二代码:


import java.util.Scanner;

public class BigSubArraySum {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        System.out.println("请输入n个整数");
        int n = input.nextInt();
        int[] arr = new int[n];

        for (int i = 0; i < n; i++) {
            arr[i] = input.nextInt();
        }

        int max = arr[0];
        int currentMax = arr[0];

        for (int i = 1; i < arr.length; i++) {

            //currentMax = (currentMax >= 0) ? arr[i] + currentMax : arr[i];

            currentMax = Math.max(arr[i] + currentMax,arr[i]);
            max = Math.max(max, currentMax);

        }
        System.out.println(max);
    }
}

数组: {0, -2, 3, 5, -1, 2} 返回值为 9,因为连续子数组3+5-1+2=9>3+5=8;

二、硬币问题
(还是有问题,当货币中为2,3,4或者其他就会出现bug,待解决)

public class MinCoins {

    public static void main(String[] args) {

        int[] coins = {1,3,5};      //coins数组存放各个无重复面值
        int value = 17;                 //value表示需要凑成的钱数
        int[] jilu = new int[value];    //记录每一步的面值
        int min = new MinCoins().solution(coins, value, jilu);
        for (int i = value - 1; i >= 0;) {
            System.out.print(jilu[i] + "->");
            i = i - jilu[i];//倒序输出每一步用的哪种币
        }
        System.out.println();
        System.out.println(min);

    }

    private int solution(int[] coins, int value, int[] jilu) {

        int[] mins = new int[value + 1];    //数组mins表示凑成多少钱所需最小钱币数目,为了使索引能达到value,加1

        mins[0] = 0;                        //凑成0元所需0个

        for (int i = 1; i <= value; i++)    //将数组中的数初始化为最大值
            mins[i] = Integer.MAX_VALUE;


        for (int i = 1; i <= value; i++) {  //从凑1元钱开始,递增直至value

            for (int j = 0; j < coins.length; j++) {//j表示第(j+1)种币

                if (coins[j] <= i) {  

                    //意思是比较所有种类的币是不是比所要凑的值小,
                    //如若比要凑得值还大就跳过比下一种币

                    mins[i] = Math.min(mins[i] , mins[i - coins[j]] + 1);
                    //将满足coins[j] <= i的coins[j]遍历一遍,则mins[i]存储的值就是几种情况中的最小值
                    jilu[i - 1] = coins[j];//记录每步所使用的币值
                }

            }

        }
        return mins[value];
    }

}

三、背包问题
w[i] : 第i个物体的重量;
p[i] : 第i个物体的价值;
arr[i][m] : 前i个物体放入容量为m的背包的最大价值;
arr[i-1][m] : 前i-1个物体放入容量为m的背包的最大价值;
arr[i-1][m-w[i]] : 前i-1个物体放入容量为m-w[i]的背包的最大价值;
由此可得:
arr[i][m]=max{arr[i-1][m-w[i]]+p[i] , arr[i-1][m]}


public class BackPack {
    public static void main(String[] args) {
        int[] w = { 3, 4, 5 };//每个货物的重量
        int[] p = { 4, 5, 6 };//每个货物的价值(与上面对应)

        int m=10;               //背包最大承重
        int n=w.length;
        int[][] arr=new int[n+1][m+1];//定义二维数组存储每种情况下背包里的物品价值   

        int i,j;

        for(i=0;i<=n;i++){      //将前(i+1)个物品放入承重为0的包里价值为0
            arr[i][0]=0;
        }

        for(j=0;j<=m;j++){      //将前0个物品放入承重为j的包里价值为0
            arr[0][j]=0;
        }

        for(j=0;j<=m;j++){      //j表示背包承重(从0递增至m)
            for(i=1;i<=n;i++){  //i表示第i个货物
                if(j<w[i-1]){   //如果第i个货物的重量w[i-1]大于背包承重则舍弃这个货物
                    arr[i][j]=arr[i-1][j];
                }else{          //如果第i个货物的重量w[i-1]小于背包承重则取两者之间最大值
                    arr[i][j]=Math.max(arr[i-1][j-w[i-1]]+p[i-1],arr[i-1][j]);
                }//或许你会问为什么取最大,加入第i个肯定比不加大呀!你说的没错但是你必须考虑能不能加,至于能不能加交给它前面的去考虑,这也是动态规划的思想之一
            }
        }

        System.out.println(arr[n][m]);


    }

}

四、最长公共子序列
这里写图片描述


public class LCS {
    public static void main(String[] args) {
        String str1="ABCDABDC";
        String str2="BBCDCADBCAD";
        char[] ch1=str1.toCharArray();
        char[] ch2=str2.toCharArray();
        int m=ch1.length;
        int n=ch2.length;
        int[][] arr=new int[m+1][n+1];
        int i,j;
        for(i=0;i<=m;i++){
            arr[i][0]=0;
        }
        for(j=0;j<=n;j++){
            arr[0][j]=0;
        }
        for(i=1;i<=m;i++){
            for(j=1;j<=n;j++){
                if(ch1[i-1]==ch2[j-1]){
                    arr[i][j]=arr[i-1][j-1]+1;
                }else{
                    arr[i][j]=Math.max(arr[i-1][j], arr[i][j-1]);
                }
            }
        }
        System.out.println(arr[m][n]);      
    }
}
最短路线与动态规划 目录 一、动态规划 二、拓展思考 如今,GPS导航为我们的交通出行带来了极大的便利,尤其是对于MC君这种路痴而言,出行已经依赖了地图导航。在地图导航软件中,我们最常用到的功能就是搜寻最短路程的路线或者最短时间的路线,我们知道,城市路网是错综复杂的,如果要遍历从出发地到终点的所有路线,计算量是巨大的,耗时也很长,那导航系统究竟是如何做到在最短的时间内搜寻到最短路线呢?吴... 阅读详情

相关推荐

2025年数学建模美赛 赛前经典案例分析 动态规划 思路解析和代码 2025年美赛(MCM/ICM)

动态规划作为一种强大的优化算法,已被广泛应用于各类实际问题中。它通过分解问题、保存子问题的解,从而提高了算法的效率。尽管动态规划的时间和空间复杂度较高,但其通过合理的状态转移方程和空间优化手段,能够有效求解复杂问题。在实践中,动态规划不仅限于传统的经典问题,还可以与机器学习、图像处理等领域结合,解决更加复杂的任务。掌握动态规划的思想和技术,能够为解决更复杂的工程问题提供有效的支持。

YOLO 856

动态规划、贪心、dynamic programming(DP)

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶

重回编程之路 1429

数据结构与算法之美:AC自动机与动态规划的理解之旅

通过深入阅读王争老师在专栏中对AC自动机和动态规划的讲解,作者经历了从迷惑到豁然开朗的心路历程。文章不仅分享了对AC自动机构建过程的美学感受,还探讨了动态规划背后的深层次原理。同时,作者通过专栏学习,将已有知识进行交叉强化理解,形成新的思维连接,尤其是在递归与数据结构关系的理解上,获得了新的启发。

weixin_42573757的博客 309

Java数据结构和算法——动态规划做题步骤详细总结

文章目录动态规划题目类型动态规划解题步骤动态规划实例讲解硬币问题机器人路径问题青蛙跳石头问题 动态规划题目类型 1、计数: 有多少种方式走到右下角 有多少种方法选出k个数使得和为Sum 2、求最大最小值: 从左上角走到右下角路径的最大数字和 最长上升子序列长度 3、求存在性: 取石子游戏,先手是否必胜 能不能选出k个数使得和是Sum 动态规划解题步骤 1、确定状态 简单的说,就是解动态规划时需要开一个数组,数组的每个元素f[i]或者f[i][j]代表什么,类似解数学题中,xyz代表什么一样,具体分为下面两个

weixin_44550963的博客 7719

VS Code配置MinGW64编译非线性优化库NLopt

VS Code用MinGW64编译C++代码安装MSYS2软件并配置非线性优化库NLopt和测试引用库代码的完整具体步骤。:若使用非UCRT版本(如传统MinGW64),替换所有路径中的。库文件会自动安装到MSYS2的。

weixin_30777913的博客 903

软件测试方法——等价类划分法详解

!如果下面这些资料用得到的话可以直接拿走:1、自学开发或者测试必备的完整项目源码与环境2、测试工作中所有模板(测试计划、测试用例、测试报告等)3、软件测试经典面试题4、Python/Java自动化测试实战.pdf5、Jmeter/postman接口测试全套视频获取6、Python学习路线图。

MXB1220的博客 1万+

动态规划做题总结

之前应该学的不是很牢固 做题有点不太会应用 所以就复习了一遍 然后先谈谈我对动态规划的理解吧 也是在借鉴了好几个文章之后 自己总结的 可能不是很好 但是应该比较便于刚开始接触的人理解 我们先看一个熟悉的题目-----------斐波那契数列 在之前学习递归时就已经对其掌握了 但是对其递归解法的更深一步思考之后 当我们需要求更多的fn值时 我们总会重复的计算f1 f2 f3..... 这也会大大的浪费时间 对此我们有了简单的解决方式 构造一个hash表 来记录 当我们再次需要某个值时 只需要

zjsru_Beginner的博客 383

博通PEX89000 PCIe 5.0交换芯片:如何为AI集群构建高效GPU互联架构

本文深入解析了博通PEX89000 PCIe 5.0交换芯片如何为AI集群构建高效的GPU互联架构。该芯片通过提供高带宽、低延迟的PCIe 5.0交换能力,打破传统GPU通信的带宽瓶颈,并支持多主机共享、资源池化及软件定义拓扑,从而显著提升大规模AI训练与推理任务的效率与资源利用率。

weixin_29214559的博客 413

【零基础学懂算法】:动态规划算法

文章首先帮助读者理解动态规划中的关键概念,如“状态”和“状态转移方程”,并深入分析如何从这些概念出发解决复杂问题。接着,文章提供了清晰的做题步骤,包括如何进行状态的填表、初始化、计算以及如何从中提取最终结果,帮助读者循序渐进掌握动态规划的解题技巧。 此外,文章通过一道LeetCode力扣的完整例题进行实战演示,帮助读者将理论应用于实际问题。最后,我们还对该题进行了算法优化,详细介绍了如何使用滚动数组来提升算法的空间效率,帮助读者进一步掌握优化技巧并提升编程能力。

luming的博客 2832

利用Langchain生成合成数据的实践指南

合成数据是相对于从真实世界事件中收集的数据而言的人工生成的数据。它用于模拟真实数据,同时避免隐私泄露或遇到真实数据中的局限性。:尽管合成数据有诸多优点,但应谨慎使用,因为它可能无法捕捉真实世界的复杂性。

eahba的博客 398

【GEE实战指南】Python本地API配置避坑与一站式环境搭建

本文详细介绍了Google Earth Engine(GEE)Python本地API的配置避坑指南与一站式环境搭建流程。通过conda创建隔离环境、账户认证关键步骤、初始化代码的正确写法以及实战测试案例,帮助开发者快速掌握GEE Python API的配置技巧,避免常见错误,提升地理空间数据分析效率。

weixin_42624889的博客 187

如何理解动态规划

如何理解动态规划,新年第一篇文章,感谢大家捧场

个人站点:javatv.net 2511

西门子1200,与V90和步科MD60第三方伺服PN通讯

需要注意的是回零方式的选择,因为V90是绝对值编码器,这里回零模式选择模式7,系统自动根据编码器反馈以及组态的机械参数,计算出轴的位置,并且掉电保持。在线访问中,找到对应的网卡,以及下面扫描到的设备,可以在线修改ip地址和profinet名称,注意一定要和组态中的完全一致。以上硬件组态上完成,主要是gsd文件导入后,添加硬件,建立连接,修改ip和profinet名称,添加报文。1- 博图V18内,设备组态,网络视图中,拖入V90以及MD60伺服,并与PLC创建连接。向厂家索要GSD文件,PN的描述文件。

weixin_37596954的博客 2464

理解递归与动态规划

1、从Fibonacci函数的四种实现聊起。 Fibonacci数列,中文也译作斐波那契数列,相信大多数同学不会陌生,就是经典的兔子问题,以下图片内容来源于网络。 很清晰地,如上所述,如果把自然数到Fibonacci数列的映射看作一个函数U(n)的话,那么有U(n) = U(n-1) + U(n-2)。编码实现的话,自然是首选递归,Fibonacci数列的递...

华为云官方博客 6361

Mac版 Android Studio自带模拟器无法联网解决方案

前言 作为一枚安卓开发者,免不了使用模拟器来开发调试(毕竟它比手机方便太多)。但是因为适配需要,我们会更多的使用真机开发调试,那么当模拟器遇到这样那样的问题,我们往往会无从下手,其中最烦的就是网络问题。 我最近图方便,又重新用起了模拟器,但是发现联网失败,用模拟器内置的浏览器也打不开网页,于是百度上一通找,毫无效果,各种说用cmd命令行设置模拟器dns的都没用,显示没有什么dns文件啥的,后来...

陈万洲的专栏 1万+

科研级YOLO26下采样革新:ContextGuided模块赋能,让特征降维兼具上下文感知的实战指南

在文件夹下新建,将上述类的代码写入其中。这一步是为了让YOLO26的代码架构能识别我们的自定义下采样模块。

LXY_LOVE36的博客 101

学习数据结构是学完一章立马做题吗?

如果你记忆力较好,喜欢趁热打铁,建议学完一章后立即做题。如果你需要时间消化知识,或者学习时间较长感到疲劳,可以等到第二天再做。最好的方式是结合两种方法:当天做一些基础题目,第二天再做综合性题目。最重要的是找到适合自己的学习节奏,并坚持实践和复习!

pys1719886504的博客 815

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

动态规划——做题五步法

动态规划是一种。

bitjs的博客 442

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

动态规划的理解

确定问题的状态,即问题的子结构。状态应该包含足够的信息来描述问题的一个局部最优解。

Alaskan_Husky的博客 1162

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

动态规划三部曲之一个故事教你透彻理解动态规划(一)

通过金矿模型介绍动态规划          对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出

v_yang_guang_v的专栏 4869

学习笔记 - 动态规划做题思路

动态规划是什么?在什么场合应用?该怎么用好动态规划?什么是无后效性?什么是满足最优子结构?

L_1900的博客 720

关于【动态规划】算法,我的一些通俗理解

目录一.解决的问题——多阶段的决策问题二.问题必须具备的性质2.1 最优子结构性质2.2 子问题重叠性质三.核心思想 一.解决的问题——多阶段的决策问题 我们需要知道,动态规划算法旨在解决这样一类问题——多阶段的决策问题。下面我们来详细介绍一下动态规划到底是什么意思?什么是多阶段的决策问题? 所谓多阶段决策过程是指这样一类决策过程:它可以把一个复杂问题按时间(或空间)分成若干个阶段,每个阶段都需要作出决策(选择),以便得到过程的最优结局。由于在每阶段采取的决策是与时间有关的而且前一阶段采取的决策如何,不但

未来科学研究所 1085

理解动态规划

看了算法导论上对动态规划的讲解,觉得自己对动态规划的理解又进了一步,之前在读到《算法之道》相关章节时就有这感觉,但是仍然不敢说自己已经完全掌握了动态规划,只是比以前又透彻了一些,说说自己新的理解,其实就是复述一下算法导论上的内容而已。0.两个例子:装配线调度问题一个产品要经过N道工序,有两条装配链提供着N道工序,在任何一道工序i时产品都可以选择在两条线上的一条进行加工,在装配线1上加工工序i的时间为a[i][1],装配线2上类似。在同一条装配线上前进不花时间,跳转到另一条装配线上需要一定的时间t[1][i]

super_chris的专栏 2492

这篇文章带你一次看懂动态规划,看完就做题

3000+字带你一次看懂动态规划,看完就做题,一做就AC! 动态规划与分治法相似,都是通过组合子问题的解来求解原问题答案,将问题划分为互不相交的子问题,递归的求解子问题,最后合并子问题的答案,得到原问题的答案。

C747217368的博客 1140

动态规划理解

动态规划理解 1,动态规划题目特点: 2,动态规划解题的一般步骤: 动态规划组成部分一:确定状态: 这个最后一步是什么意思?下面举个例子: 最后一步就是:最优策略中的最后一个决策。 子问题是什么? 那么以上的分析:和递归有什么不同? 那么以上递归解法出现的问题: 从以上图中,可以看出:其有很多的重复计算。这样的话,在计算过程中就会超时。 如何避免?用动态规划。 将计算结果保存下来,并改变计算顺序。 动态规划组成部分二:转移方程: 动态规划组成部分三:初始条件和边界情况: 其实,初

chen772209的博客 480

实践中理解动态规划(简单详细)

实践中理解动态规划(简单详细) 摘要:     动态规划(dp)是算法比赛中常考的算法,个人感觉也是最有难度的算法。因此本文会介绍动态规划在实践中的几个步骤来理解动态规划 一、什么是动态规划 ​ 动态规划就是问题的最优解如果可以由子问题的最优解推导得到,则可以先求解子问题的最优解,在构造原问题的最优解; ​ 简单来说...

程序猿练习生 1346
上一篇: JAVA笔试题笔记(三)
下一篇: 分治算法
詹詹自喜KING
博客等级 码龄11年 40粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值