dp算法篇Day1

article/2025/9/13 8:30:50

 "多希望有人来陪我,度过末日啊~"


        讲讲我为什么突然想更新这篇栏目。

        想想自己也算 "系统" 接触计算机这个学科也有差不多一年了,回想起当初下定决心要全身心投入到这个专业或者说行业中来,现在到了这样的地步,是否很符合当初对自己的期待,对这个专业行业的期待?想想做软件开发相关最最基础的四大组件,算法和数据结构、操作系统和计算机网络、数据库,再怎么说到了现在也涉略一二。对于我来说,除了在系统部分上很花时间外,其次就应当属算法,当然很多算法也会相关到部分容器,那么这类题目也会变成算法+数据结构的”双重打击”。

        在第一次接触算法的时候,给我的感觉就是需要投入的时间大,以及微乎可微的反馈成果。所以一开始我对于算法其实是持有排斥的状态。可是,当你看到各个公司的笔试题,首当其冲给你甩几道面试题,而你却迟迟敲不了几行代码、捶胸敦促……痛定思痛之后,不得不重视到代码能力的提升上,其中唯一一条且至关重要的,且是一个从业者也会建议的—— “多刷刷算法题“。

        道理我都懂,我也有时间有那个心气去刷,可是看到那一个个标榜“简单”难度的迟迟做不出来,一看题解似乎并没有想象的那么难,有那么点道理,开始理解,而此时评论区一片 “简单的、祥和”的画面。到一个标榜“中等”难度的题似乎成了更难以跨越的"鸿沟"更别提 那写满一张网页的“题解”……

        你开始暗下决心,告诉自己“慢慢来”,你便”胸有成竹”般地给自己定下每天刷个3~4道算法题的小目标,于是乎你每天开始登上账号开始刷题,看着不会,翻翻题解,试着敲敲,似乎理解,运行成功,下一道题……而这种状态持续不了多久,你就会没了兴趣,因为你发现坚持了几天后,仍然是一事无成,竟没做出一道题!未免心里有些波动,有时候看到算法题就显得有些恐惧和排斥,那心里上暗示的每天刷题的目标,不自觉地变暗了下去,就连自己也不想再去记起……

        " 多希望有人来陪我,度过末日啊~"。

        还是那句话,永远不要放弃你自己,都是这么走过来的。


        永恒的题解思路:

 


1、第N个斐波那契数

 (1) 题意分析 

        本题肯定是非常简单的一种dp规划,因为题中就已经告知了dp的状态转移方程和初始化,没什么很大的难度。

class Solution {
public:int tribonacci(int n) {if(n < 1) return  0;if(n < 2 || n < 3) return 1;vector<int> dp(n+1);dp[0] = 0,dp[1] = dp[2]= 1;// 但是从T4 填dp表for(int i=3; i <= n; ++i)dp[i] = dp[i-1]+dp[i-2]+dp[i-3];return dp[n];}
};

 (2) 空间优化

        多数时候对dp的优化要求不是那么显眼,最主要的是做出来。我们分析上述代码的时空复杂度分别为,O(n) \ O(n)。

        在本题可以使用滚动数组,对空间复杂度进行优化,下降至O(1)的常数。

        因为要求 第n个泰波那契数,本质只需要知道它前三个数的状态即可~

class Solution {
public:int tribonacci(int n) {if(n < 1) return  0;if(n < 2 || n < 3) return 1;int a=0;int b=1,c=1;int d=0;// 这里从i下标3开始for(int i=3; i<=n; ++i){d = a + b + c;// 条件更新a = b;b = c;c = d;}return d;}
};

 


 

2、三步问题

(1) 题目解析 

         这道题桶上面那到泰波那契数,换汤不换药,仍然是根据题目得到状态表示,再根据状态表示相邻的位置,推出状态方程。 

边界位置:

class Solution {
public:int waysToStep(int n) {if(n == 1 || n==2) return n; if(n == 3) return 4;// 题目要求 别忘记对加法modconst int MOD = 1e9+7;vector<int> dp(n+1);dp[1] = 1,dp[2]=2,dp[3]=4;for(int i=4; i<=n ;++i)dp[i] = ((dp[i-1] + dp[i-2]) % MOD + dp[i-3] ) % MOD;return dp[n];}
};

     


3、最小花费爬楼梯

(1) 题目解析

思路一: 到达i位置的最小花费

边界位置:

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();vector<int> dp(n+1);dp[0]=dp[1]=0;for(int i=2; i<=n; ++i)dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);return dp[n];}
};

思路二: 从i位置开始 的最小花费

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();vector<int> dp(n);dp[n-1] = cost[n-1];dp[n-2] = cost[n-2];// 从右往左for(int i=n-3; i>=0; --i)// 往后dp[i] = min(dp[i+1],dp[i+2]) + cost[i];return min(dp[0],dp[1]);}
};


4、解码方法

(1) 题目解析

        本题的核心是抓住解码的两种状态:

        ① 用一位进行解码,但是它有成功和失败,一旦成功那么dp[i-1]处每一个解法都可以添加一个s[i],反之一旦解码失败,说明到达第i位置处,之前的解码都是0。 

        ② 用两位解码,也是有成功和失败,同样如果解码成功,也就意味着dp[i-2]代表的解法综总和,都可以添加上 (s[i-1],s[i] ) ,反之 为0。

class Solution {
public:int numDecodings(string s) {int n = s.size();vector<int> dp(n);dp[0] = s[0] != '0';if(n == 1) return dp[0];if(s[0] !='0' && s[1] !='0') dp[1] += 1;int t=(s[0]-'0') * 10 + s[1] -'0';if(t >= 10 && t <= 26) dp[1] += 1;for(int i=2; i<n; ++i){// 单独解码if(s[i] != '0') dp[i] += dp[i-1];// 两位解码int t = (s[i-1]-'0') * 10 + s[i] -'0';if(t >= 10 && t <= 26)dp[i] += dp[i-2];}return dp[n-1];}
};

优化版本:

         细心的你肯定能够发现,代码里标注的两处,他们的实现功能似乎是一样的,能否有个方法让代码完成复用呢? 换句话说,就是让我们把dp[2] 这个位置放到循环里面初始化。

class Solution {
public:int numDecodings(string s) {int n = s.size();vector<int> dp(n+1);dp[0] = 1;dp[1] = s[0] != '0';if(n == 1) return dp[1];for(int i=2; i<=n; ++i){// 因为dp多开了一个 对应到的s内的下标应该-1if(s[i-1] != '0') dp[i] += dp[i-1];int t = (s[i-2]-'0') * 10 + s[i-1] -'0';if(t >= 10 && t <= 26)dp[i] += dp[i-2];}return dp[n];}
};

       


5、不同路径

(1) 题目解析

        这类路径题总的来说是很简单的,找到结束位置即可。

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m+1,vector<int>(n+1));// dp[1][0] = 1dp[0][1] = 1;for(int i=1; i<=m; ++i){for(int j=1; j<=n; ++j){dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[m][n];}
};

       


本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~

 

 

 


http://chatgpt.dhexx.cn/article/qZbadKAD.shtml

相关文章

第十四周DP算法总结

这周自己主要再看DP算法的博客&#xff0c;感觉DP这一部分内容确实比之前的都要麻烦一些&#xff0c;最后攻克这一部分难题还是挺好的。 这周自己总结了一些题型&#xff0c;以及一些方法思路&#xff0c;最后再把动态规划和之前的分治和贪心做一下比较。下面是详细的总结。 动…

DP算法(Dynamic Programming,俗称动态规划)是最经典算法之一

DP算法&#xff08;Dynamic Programming,俗称动态规划&#xff09;是最经典算法之一.本笔记以耳熟能详的数塔问题为引子,深入讨论01背包的解决方法. 首先,如下图所示,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少&#xff1f; 这个问题,对…

DP算法:动态规划算法

步骤 &#xff08;1&#xff09;确定初始状态 &#xff08;2&#xff09;确定转移矩阵&#xff0c;得到每个阶段的状态&#xff0c;由上一阶段推到出来 &#xff08;3&#xff09;确定边界条件。 例题 蓝桥杯——印章&#xff08;python实现&#xff09; 使用dp记录状态&#x…

动态规划(DP)算法初识

先用大白话来说一下几种经典算法大概的意思&#xff1a; 贪心算法&#xff1a;我就一次机会&#xff0c;为了达到目的&#xff0c;其他的我啥也不考虑回溯算法&#xff1a;我有无数次机会&#xff0c;还能怕我有达不到目的的时候&#xff1f;动态规划算法&#xff1a;我能随意…

常用十大算法_动态规划算法(DP)

动态规划算法&#xff08;DP&#xff09; 高能预警&#xff1a;DP算法不容易理解&#xff0c;需要动脑筋查资料找例题 动态规划算法&#xff08;Dynamic Programming&#xff09;&#xff0c;是将复杂问题拆分成子问题&#xff0c;并在子问题的基础上&#xff0c;求解复杂问题…

动态规划算法(DP)

校招笔试面试前,大家一般都会先去牛客网上刷刷题,《剑指offer》,《leetcode》走起来,然后初次入手,发现很多不会,不会到什么程度呢,连个想法都没有,于是就去讨论区看答案,然后java大神,c++大神会给出花式解答,他们喜欢在答案前加一句,简单的dp算法,递归就可以解决…

【算法笔记】树形DP算法总结详解

0. 定义 树形DP&#xff0c;又称树状DP&#xff0c;即在树上进行的DP&#xff0c;是DP&#xff08;动态规划&#xff09;算法中较为复杂的一种。 1. 基础 令 f [ u ] f[u]~ f[u] 与树上顶点 u u u有关的某些数据&#xff0c;并按照拓扑序&#xff08;从叶子节点向上到根节点…

★动态规划(DP算法)详解

什么是动态规划&#xff1a;动态规划_百度百科 内容太多了不作介绍&#xff0c;重点部分是无后效性&#xff0c;重叠子问题&#xff0c;最优子结构。 问S->P1和S->P2有多少种路径数&#xff0c;毫无疑问可以先从S开始深搜两次&#xff0c;S->P1和S->P2找出所有路…

ubuntu安装qt

Ubuntu安装qt 到qt官网下载“qt-opensource-linux-x64-5.9.1.run” 分别安装g, build-essential, libglq-mesa-dev, libglu1-mesa-dev freeglut3-dev 输入指令&#xff1a;”sudo apt-get install g” -> “sudo apt-get install build-essential” -> “sudo apt-get i…

QT安装、构建套件(MSVC、MinGW)配置

QT安装、构建套件(MSVC、MinGW)配置 1. QT框架及QT Creator下载 登录QT官网-https://www.qt.io/download。 点击downloads for open source users 在页面最下方&#xff0c;点击Download the QT online Installer。 在安装网页的最下方处有一行小字 “We do recommend yo…

QT linux安装

转载地址&#xff1a;http://www.cnblogs.com/tangkaixuan/p/6504102.html 文章来自https://lug.ustc.edu.cn/sites/qtguide/ 1.4 Qt在Linux下安装 Qt在Linux系统里的安装要稍微复杂一些&#xff0c;因为Linux发行版众多&#xff0c;所以安装过程有些差异。 由于Linux系统都可…

Qt国内镜像安装

下载安装程序 https://download.qt.io/official_releases/online_installers/ 使用国内镜像打开安装程序 G:\下载\qt-unified-windows-x64-4.5.1-online.exe --mirror https://mirror.nju.edu.cn/qt清华源 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/win…

Qt下载与安装

一、Qt和Qt Creator的区别 Qt是C的一个库&#xff0c;或者说是开发框架&#xff0c;里面集成了一些库函数&#xff0c;提高开发效率。 Qt Creator是一个IDE&#xff0c;就是一个平台&#xff0c;一个开发环境&#xff0c;类似的比如说VS&#xff0c;也可以进行Qt开发&#xff…

Ubuntu 安装QT

一、最近这家公司接到一个订单&#xff0c;客户使用到国产操作系统&#xff0c;意味着需要使用到 Linux 系统&#xff0c;于是乎&#xff0c;之前的东西又要捡起来&#xff0c;而且&#xff0c;平时代码主要是windows 平台&#xff0c;这次需要将代码移植到linux 平台&#xff…

QT的安装------QT

由于现在的qt都是线上下载了&#xff0c;那我们就去qt的官网下载 download.qt.io 我们选择倒数第二个------archive(档案)&#xff0c;顺便学一下英文。 然后选择online install&#xff08;在线安装&#xff09; 身为先进人&#xff0c;当然选择最新的版本&#xff08;团新版…

VS+QT安装配置

心血来潮&#xff0c;装个QT&#xff0c;遇到好多问题&#xff0c;记录一下&#xff08;铭记那些踩过的坑&#xff09; 软件版本&#xff1a;vs是2022&#xff0c;qt是6.3.1 qt下载地址&#xff1a;Download Qt | Develop Desktop & Embedded Systems | Qt 点进去往下翻&…

Windows Qt安装教程

目录 一、Qt安装包下载二、Qt安装流程 一、Qt安装包下载 Qt官网&#xff1a;https://download.qt.io/ Qt官方提供的专门的资源下载网站&#xff0c;所有的开发环境和相关工具都可以从这里下载&#xff0c;Qt 官方下载网站如下图&#xff1a; 点击进入archive目录&#xff0c;…

Qt安装教程-详细

本文主要介绍了Qt5.9.7的安装步骤。 Qt下载 Qt的下载地址: http://download.qt.io/archive/qt/ qt-opensource-windows-x86-5.9.7.exe 是一个综合的安装包(5.8之前分开下载各个编译器版本SDK)&#xff0c;下载后安装的时候可以选择安装哪个编译器对应的SDK。一般可选MinGW 或…

QT下载安装

1、下载路径 https://download.qt.io/archive/qt/5.9/5.9.9/ 文件比较大&#xff0c;建议可以Qt 镜像网站 下载 国内著名的 Qt 镜像网站&#xff0c;主要是各个高校的&#xff1a;中国科学技术大学&#xff1a;http://mirrors.ustc.edu.cn/qtproject/ 清华大学&#xff1a;htt…

QT安装 and VS2019中安装QT插件

目录 VS中安装QT扩展插件1. 安装qt软件2. 在VS中安装qt扩展插件 VS中创建QT项目 VS中安装QT扩展插件 1. 安装qt软件 QT下载网址&#xff08;各版本&#xff09;. QT(5.12.11)直达界面. 根据操作系统不同&#xff0c;选择相应版本下载 双击运行… 输入QT账号信息&#xff0…