【玩转算法】(初始)动态规划

news2024/9/22 15:48:53

  •  本期主题:动态规划,及其相关oj题。
  • 博客主页:小峰同学
  • 分享小编的在Linux中学习到的知识和遇到的问题
  • 小编的能力有限,出现错误希望大家不吝赐

 

🍁1)DP定义

  • 动态规划是分治思想的延伸,通俗一点来说就是大事化小,小事化无的艺术。
  • 在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接 使用这些结果。

动态规划具备了以下三个特点

  • 1. 把原来的问题分解成了几个相似的子问题。
  • 2. 所有的子问题都只需要解决一次。
  • 3. 储存子问题的解。

动态规划的本质,是对问题状态的定义状态转移方程的定义

也就是(状态以及状态之间的递推关系)

动态规划问题一般从以下四个角度考虑:

  • 1. 状态定义
  • 2. 状态间的转移方程定义
  • 3. 状态的初始化
  • 4. 返回结果
  • 状态定义的要求:定义的状态一定要形成递推关系
  • 一句话概括三特点四要素两本质
  • 适用场景:最大值/最小值, 可不可行, 是不是,方案个数 

🍁2)斐波那契

牛客网_oj

方法一:递归

缺点:

  • 时间复杂度0(N^2),非常低效的一个算法。

优点:

  • 代码简单易理解。
int Fibonacci(int n ) {
    // write code here
    if(n ==0){
        return 0;
    }
    if(n == 1 || n ==2){
        return 1;
    }
    return Fibonacci(n-1) + Fibonacci(n-2);
}

方法二:动态规划

优点:

  • 相比于递归更高效一些。时间复杂读为O(N)。
  • 代码也易懂的。

缺点:

  • 其实F(n)只与它相邻的前两项有关,所以没有必要保存所有子问题的解。
  • 空间复杂度为O(N),创建了一个数组,但是空间复杂度可以优化为O(1)。
class Solution {
public:
    int Fibonacci(int n) {
    //分析
    //1.状态:F(i)第i项的值
    //2.状态转换方程:F(i) = F(i-1)+F(i-2)
    //3.初始状态:F(0) = 0; F(1) = 1
    //4.返回: F(n)

    //我们要保存中间状态的解。就需要一个数组。
    //先创建一个数组
    int* F = new int[n+1];//注意这里的 n+1;
    //初始化为初始状态
    F[0] = 0;
    F[1] = 1;
    //状态转换方程 :F(i) = F(i-1)+F(i-2)
    for(int i = 2; i<=n; i++){
        F[i] = F[i-1]+F[i-2];
    }
    return F[n];
    
//优化
    if(n==0) return 0;
    if(n==1) return 1;
    int fn,fn1 = 0,fn2 = 1;
    for(int i = 2; i<=n; i++){
        fn = fn1 + fn2;
        fn1 = fn2;
        fn2 = fn;
    }
    return fn;

//再优化
    int a = 0,b = 1;
    while(n--){
        b = a+b;
        a = b-a;
    }
    return a;
    }
};

🍁3)字符串分割

牛客网_oj

方法一:递归

优点:相对于暴力遍历来说,代码时间复杂度和空间复杂度都相对

class Solution {
public:
    bool wordBreak(string s, unordered_set<string> &dict) {
        //注意这里的被分割是指,能在词典中找到。
        // 方法:动态规划
        // 状态:
        // 子状态:前1,2,3,...,n个字符能否根据词典中的词被成功分词
        // F(i): 前i个字符能否根据词典中的词被成功分词

        // 状态递推:
        // F(i): true{j <i && F(j) && substr[j+1,i]能在词典中找到} OR false
        // 在j小于i中,只要能找到一个F(j)为true,并且从j+1到i之间的字符能在词典
        // 中找到,则F(i)为true

        // 初始值:
        // 对于初始值无法确定的,可以引入一个不代表实际意义的空状态,作为状态的起始
        // 空状态的值需要保证状态递推可以正确且顺利的进行,到底取什么值可以通过简单
        // 的例子进行验证
        // F(0) = true

        // 返回结果:F(n)

        //实现
        if(s.empty()){ return false; }
        if(dict.empty()){ return false; }

        //创建一个数组保存子状态,便于后面状态使用
        vector<bool> can_break(s.size() + 1, false);

        // 初始化F(0) = true
        can_break[0] = true;

        for (int i = 1; i <= s.size(); i++){
            for (int j = i - 1; j >= 0; j--){
            // F(i): true{j <i && F(j) && substr[j+1,i]能在词典中找到} OR false
            // 第j+1个字符的索引为j
                if (can_break[j] && dict.find(s.substr(j, i - j)) != dict.end()){
                    can_break[i] = true;
                    break;
                }
            }
        }
        return can_break[s.size()];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

核酸检测预约系统毕业设计,核酸检测系统设计与实现,毕业设计怎么写论文毕设源码开题报告需求分析怎么做

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的疫情核酸检查预约系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于java的springboot框架下开发&#xff1b;&#xff1b;通过后台设置医院信息、录入医院科室信息、录入医生信息、设…

CVE-2015-4852 Weblogic T3 反序列化分析

0x01 前言 看到很多师傅的面经里面都有提到 Weblogic 这一个漏洞&#xff0c;最近正好有一些闲暇时间&#xff0c;可以看一看。 因为环境上总是有一些小问题&#xff0c;所以会在本地和云服务器切换着调试 0x02 环境搭建 太坑了&#xff0c;我的建议是用本地搭建的方法&…

DeadObjectException解题

DeadObjectException解题 RemoteException occurs on reporting focusChanged, wWindow{2470935 u0 bundle_id/bundle_id.MainActivity}android.os.DeadObjectExceptionat android.os.BinderProxy.transactNative(Native Method)at android.os.BinderProxy.transact(Binder.ja…

十大开源测试工具和框架

免费的开源框架和工具由于其开源特性&#xff0c;现在逐渐成为自动化测试的首选解决方案。区别在于&#xff0c;你是喜欢使用类库编写一个全新的自动化测试框架&#xff0c;或者喜欢使用一个现成的工具。 本文帮忙你快速了解 10 大免费和开源测试工具、框架。 Katalon Studio…

【python】昔去雪如花,今来花似雪,今日份雪花快递到啦

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~ 大雪已至&#xff0c;冬天无恙&#xff0c;愿这个冬天的你&#xff0c;不缺暖阳&#xff0c;好日常在 小时候&#xff0c;冬天最盼望的就是下雪了~雪一下 在地上铺上一层雪白的毛毯的时候甚是好看~ 还能堆堆雪人、打打雪仗…

如何使用 django-import-export + pandas 在 Django 视图中导入 excel 数据

我想每个人都熟悉所有强大的库 django-import-export,它允许我们在 Django 的管理面板中导入和导出数据,但是如果你想让用户在网络上上传 excel 文件或通过 REST 上传它怎么办应用程序接口。最近,我遇到了类似的问题。经过大量研究,我找到了一种使用 Django 方式将数千个数…

基于jsp+mysql+ssm生鲜超市进销存管理系统-计算机毕业设计

项目介绍 目前超市越来越多&#xff0c;越来越普及&#xff0c;如何高效的管理经营超市才是成功的关键,其中对于中小型超市来说&#xff0c;在降低成本的前提下使用最有效的管理方式是非常重要的&#xff0c;所以开发中小型超市管理系统既考虑了成本相对较低又非常实用的特点。…

博客系统(前后端分离)

文章目录前言一、需求分析1.功能2.环境二、前端实现1.博客注册页2.博客登录页3.博客列表页4.博客详情页5.博客编辑页三、后端实现1.设计数据库表2.封装连接数据库的公共操作3.封装对博客表和用户表的操作4.实现博客列表页、博客详情页、博客编辑页的后端服务5.实现博客登录页面…

linux关于ssh免密登录、known_hosts文件

1. 关于ssh SSH 是 Secure Shell 的缩写&#xff0c;SSH 为建立在应用层基础上的安全协议。SSH 是目前广泛采用的安全登录协议&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议&#xff0c;替代以前不安全的Telnet协议。利用 SSH 协议可以有效防止远程管理过程中的…

springboot车辆管理系统的设计与实现毕业社会源码031034

车辆管理系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&…

java常量定义在interface和final class的区别?

问题现象&#xff1a; java常量定义在 interface 和 final class 的区别&#xff1f; 问题分析&#xff1a; 最近在项目开发规范中&#xff0c;发现有要求使用 interface类 来定义常量&#xff01; 这让我想起来以前一直是用 final class 来定义常量的&#xff1b;那么这两者是…

【Eigen】Eigen库基础语法

这里是Eigen库的一些基础语法&#xff0c;摘自《视觉SLAM十四讲》&#xff0c;修改了书中代码的一些bug&#xff0c;部分地方添加了一些自己的理解。 头文件相关 #include <Eigen/Core> // Eigen 核心部分 #include <Eigen/Dense> // 稠密矩阵的代数运算&#xff…

Java - 通过反射进行赋值以及函数调用

Java - 通过反射进行赋值以及函数调用前言一. 通过反射进行赋值1.1 测试1.2 总结二. 通过反射进行函数调用前言 说来惭愧&#xff0c;虽然反射在Java中是非常重要和常见的一种机制。但是&#xff0c;每当自己去写这方面的代码的时候&#xff0c;总是容易愣住。还得想一想代码怎…

题库API搭建接口

题库API搭建接口 本平台优点&#xff1a;免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a;题库后台http://daili.jueguangzhe.cn/ 题库后台…

社招前端vue面试题汇总

用过pinia吗&#xff1f;有什么优点&#xff1f; 1. pinia是什么&#xff1f; 在Vue3中&#xff0c;可以使用传统的Vuex来实现状态管理&#xff0c;也可以使用最新的pinia来实现状态管理&#xff0c;我们来看看官网如何解释pinia的&#xff1a;Pinia 是 Vue 的存储库&#xff…

机器学习数据不均衡处理教程

机器学习数据不均衡处理教程 学习对数据进行过采样和欠采样、应用 SMOTE、集成方法和成本敏感型学习假设 课程英文名&#xff1a;Machine Learning with Imbalanced Data 此视频教程共13.5小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附件全 下…

Apriori算法及例题

一&#xff1a;Apriori算法介绍 关联规则挖掘是数据挖掘中最活跃的研究方法之一 。最早是由 Agrawal 等人提出的1993最初提出的动机是针对购物篮分析问题提出的&#xff0c;其目的是为了发现交易数据库中不同商品之间的联系规则。这些规则刻画了顾客购买行为模式&#xff0c;可…

Java去除文档阴影

Java去除文档阴影 一、前言 文稿扫描大家用的都比较频繁、想是各种证件、文件都可以通过扫描文稿功能保存到手机。相比直接拍照&#xff0c;在扫描文稿时&#xff0c;程序会对图像进行一些矫正。比如去除阴影、修正倾斜、旋转矫正等。进行这些处理后的图片要更加容易识别。今…

学习下c++原来它和Java有很多相似的地方

Java和CJava和C区别简单学习下C语法C 是什么&#xff1f;C工作原理&#xff1a;C标识符C基本数据类型C关键字封装&#xff0c;继承&#xff0c;多态简单回顾下Java语法Java的基础语法&#xff1a;Java注释Java标识符Java修饰符Java 接口和继承Java8 新增的特性Java和C区别 Java…

VTK-vtkPointInterpolator/vtkInterpolatorKernel

欢迎大家加入社区&#xff0c;雪易VTK社区-CSDN社区云 前言&#xff1a;目前在做模型的ReMesh&#xff0c;在研究这个接口&#xff0c;希望能有所帮助。 vtkPointInterpolator 描述&#xff1a; 变量&#xff1a; Strategy&#xff1a;MASK_POINTS, NULL_VALUE, CLOSEST_POI…