算法刷题-动态规划-1

算法刷题-动态规划-1

  • 不同路径
  • 不同路径||
    • 方法一:
    • 方法二
  • 第N个泰波那契数
    • 递归写法
    • 滚动数组
  • 三步问题
    • 递归操作
    • 滚动数组
  • 使用最小画法爬楼梯
    • 递归
  • 解码方法
    • 方法一
    • 方法二:(大佬讲解)

不同路径

在这里插入图片描述
在这里插入图片描述

//机器人不同的路径进入到指定的地点
public static int uniquepath(int m, int n) {if (m <= 0 || n <= 0){return 0;}int[][] dp = new int[m][n];//初始化//如果只有i,j中有一个为0,那么机器人行走的方向只能有一种方式for (int i = 0; i < m; i++){dp[i][0] = 1;}for (itn i = 0; i < n; i++)  {dp[0][i] = 1;  }//推导出dp[m-1][n-1],因为定义dp[i][j]就是表示的是在[i][j]点  //不同的路径的数目  for (itn 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 - 1][n - 1];    }

不同路径||

在这里插入图片描述

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/55c59dbc1da64e20aed014ff76118002.png)

方法一:

大佬讲解
在这里插入图片描述

class Solution {
public:/*** 1. 确定dp数组下标含义 dp[i][j] 从(0,0)到(i,j)可能的路径种类;* 2. 递推公式 dp[i][j] = dp[i-1][j] + dp[i][j-1] 但是需要加限制条件就是没有障碍物的时候*    if(obstacleGrid[i][j] == 0) dp[i][j] = dp[i-1][j] + dp[i][j-1];* 3. 初始化 当obstacleGrid[i][j] == 0时,dp[i][0]=1 dp[0][i]=1 初始化横竖就可;* 4. 遍历顺序 一行一行遍历;* 5. 推导结果;*/int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {/* 计算数组大小 */int m = obstacleGrid.size();int n = obstacleGrid[0].size();/* 定义dp数组 */vector<vector<int>> dp(m,vector<int>(n,0));/* 初始化dp数组 */for(int i = 0; i < m && obstacleGrid[i][0] == 0; i++)dp[i][0] = 1; for(int i = 0; i < n && obstacleGrid[0][i] == 0; i++)   dp[0][i] = 1;      /* 一行一行遍历 */     for(int i = 1; i < m; i++) {     for(int j = 1; j < n; j++) {     /* 去除障碍物 */     if(obstacleGrid[i][j] == 1) continue;     dp[i][j] = dp[i-1][j] + dp[i][j-1];     }}return dp[m-1][n-1];     }
};

方法二

多加一行和一列的虚拟节点,防止出现越界的情况,
把它们初始化成0,但是要保证第一个节点初始化成1.
dp[0][1] = 1;


class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size(), n = obstacleGrid[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));dp[0][1] = 1;for(int i = 1; i <= m; i++) {for(int j = 1; j <= n; j++) {if(obstacleGrid[i - 1][j - 1] == 1) continue;else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m][n];}

第N个泰波那契数

在这里插入图片描述


递归写法

1。先确定函数的一定是什么dp[ i ] 表示:第 i 个泰波那契数
2。题目中的关系代数是 dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] + dp[ i - 3。边界是T(0)=0,T(1)=1,T(2)=1T(0)=0, T(1)=1,
4。初始化为dp[ 0 ] = 0,dp[ 1 ] = 1,dp[ 2 ] = 1

class Solution {
public:int tribonacci(int n) {vector<int> dp(n + 1);if (n == 0) {return 0;   }if (n <= 2)   {return 1;   }dp[0] = 0, dp[1] = 1, dp[2] = 1;   for (int i = 3; i <= n; i++) {   dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];   }return dp[n];   }
};

滚动数组

class Solution {
public:int tribonacci(int n) {if (n == 0) {return 0;}if (n <= 2) {  return 1;  }int p = 0, q = 0, r = 1, s = 1;  for (int i = 3; i <= n; ++i) {  p = q;  q = r;  r = s;  s = p + q + r;  }return s;  }
};

三步问题

在这里插入图片描述

这就是老油条的步骤了,
先确定自己定义的函数,然后找出关系式,然后确定初始值

递归操作

class Solution {  
public:  int waysToStep(int n) {  vector<in#t> dp(n + 1);  const int MOD = 1e9 + 7;  //边界问题    if (n == 1 || n == 2) return n;    if (n == 3) return 4;    //初始化定义    dp[1] = 1, dp[2] = 2, dp[3] = 4;    for (int i = 4; i <= n; i++) {   dp[i] = ((dp[i - 3] + dp[i - 2]) % MOD + dp[i - 1]) % MOD;   }return dp[n];   }
};

滚动数组

class Solution {    
public:    int waysToStep(int n) {     int a=1,b=2,c=4,i;     for(i=2;i<=n;i++){     long long t=(a+b)%1000000007;     t=(t+c)%1000000007;     a=b;     b=c;     c=t;     }return a;     }
};

使用最小画法爬楼梯

在这里插入图片描述
在这里插入图片描述

题目要求的是到达第n级台阶楼层顶部的最小花费,可以用动态规划来解,下面一步一步来讲怎样确定状态空间、怎样给出状态转移方程。

递归

  1. 大佬讲解

  2. 最近的一步有两种情况,

  3. 从 dp[ i - 1 ] 走一步过来,支付cost[ i - 1 ] 的费用; 1. 从 dp[ i - 1 ] 走一步过来,支付cost[ i - 1 ] 的费用;

  4. 从 dp[ i - 2 ] 走两步过来,支付cost[ i - 2 ] 的费用。
    而 dp[ i ] 就是到达 i 位置的最小花费,
    那我们就能得出状态转移方程:
    dp [ i ] = min( dp[ i - 1 ] + cost[ i - 1 ],dp[ i - 2 ] + cost[ i - 2 ] )


class Solution {  
public:  int minCostClimbingStairs(vector<int>& cost) {  int n = cost.size();  // 创建dp表,这样初始化默认填充的是 0   vector<int> dp(n + 1);  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];  }
};

解码方法

在这里插入图片描述

在这里插入图片描述

方法一

动态规划的使用:
1。确立dp 数组的定义,代表的是 dp[i] 位置代表的是第i个位置时候解码方法的总数。
2。找关系代数=

  1. s[ i ] 单独解码,如果是单独解码,当 s[ i ] 的值是 1~9 的时候可以自己解码,
    自己解码的方案数就是 dp[ i - 1 ],如果 s[ i ] 的值是 0,那方案数就是0,整体解码失败,

  2. s[ i ] 和 s[ i - 1 ] 一起解码,当 s[ i - 1 ] * 10 + s[ i ] 的值是 10~26 的时候就可以解码,
    而解码数就是 dp[ i - 2 ],如果解码失败,不在这个区间内,那方案数就也是0。
    3。初始化dp数组,
    初始化 dp[ 0 ] 和 dp[ 1 ] 位置,
    dp[ 0 ] 位置,如果s[ 0 ] 解码成功就是1,不成功就是0
    dp[ 1 ] 位置,如果 dp[ 1 ] 能自己解码,就 + 1,如果能跟 dp[ 0 ] 一起解码,就再 + 1,
    如果dp[ 1 ] 两种情况都不能解码,就是0。(所以可能是0, 1, 2)

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

方法二:(大佬讲解)

在这里插入图片描述

class Solution {
public:int numDecodings(string s) {if (s[0] == '0') return 0;int n = s.size();vector<int> dp(n + 1, 1);//dp[0]表示s[-1]的状态, dp[1] 表示 s[0]的状态//dp[i] 表示 s[i-1]的状态for (int i = 2; i <= n; i++) {if (s[i - 1] == '0') {if (s[i - 2] == '1' || s[i - 2] == '2')//唯一译码,不增加情况dp[i] = dp[i - 2]; else//这里要好好理解一下,比如给定340, 输出可行的编码数为0, 因为0和40都无法转换  return 0;  }else if (s[i - 2] == '1' || s[i - 2] == '2' && s[i - 1] >= '1' && s[i - 1] <= '6')dp[i] = dp[i - 1] + dp[i - 2];  else//当上述条件都不满足,维持上一个状态  dp[i] = dp[i - 1];  }//for(auto c:dp) cout << c << ",";  return dp[n];//返回dp[n] 即最后 s[n-1] 的状态  }
};

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

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

相关文章

Android13集成paho.mqtt.android启动异常

项目中原依赖是&#xff1a; implementation(org.eclipse.paho:org.eclipse.paho.android.service:1.1.1) {exclude module: support-v4transitive true } implementation org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5在Android10系统运行正常&#xff0c;能够连接…

人工智能-循环神经网络的简洁实现

循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35…

C#获取枚举Enum的描述

简单封装个扩展方法&#xff0c;方便下次使用。 using System.ComponentModel;namespace Order.Core.API.Enums {public enum AccountStatus{[Description("账号不存在&#xff01;")]AccountNotExist 1,[Description("密码错误&#xff01;")]PasswordE…

最常用的5款报表系统

在这个信息化飞速发展的时代&#xff0c;报表系统已经成为了企业管理和决策的重要工具。随着市场的需求不断增长&#xff0c;报表系统也在不断地更新和完善。如今&#xff0c;市面上有数不尽的报表系统&#xff0c;但是哪款才是最常用的呢&#xff1f;接下来&#xff0c;我们将…

开源之夏 2023 | Databend 社区项目总结与分享

开源之夏是由中科院软件所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;培养和发掘更多优秀的开发者&#xff0c;促进优秀开源软件社区的蓬勃发展&#xff0c;助力开源软件供应链建设。 官…

node.js获取unsplash图片

1. 在Unsplash的开发者页面注册并创建一个应用程序&#xff0c;以便获取一个API访问密钥&#xff08;即Access Key&#xff09;。 2. 安装unsplash-js库和axios&#xff1a; npm install axios3. 使用获取到的API密钥进行请求。 示例代码如下&#xff1a; const axios req…

3DEXPERIENCE许可管理工具:掌控设计软件许可,提高企业竞争力

在当今竞争激烈的设计领域&#xff0c;合理的软件许可管理对于企业的成功至关重要。3DEXPERIENCE作为一款功能强大的设计软件&#xff0c;提供了全面且易于使用的许可管理工具。本文将详细介绍3DEXPERIENCE的许可管理工具及其对企业管理的价值&#xff0c;帮助您更好地了解和利…

【正点原子STM32连载】第五十六章 DSP BasicMath实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第五…

【管理运筹学】背诵手册(四)| 整数规划

四、整数规划 整数规划根据变量取值的限制形式&#xff0c;可分为三种&#xff1a; 纯整数规划&#xff08;IP&#xff09;。混合整数规划&#xff08;MIP&#xff09;。0-1 整数规划&#xff08;BIP&#xff09;。 不能用凑整的方法去求整数规划问题的最优解&#xff0c;用…

ChinaSoft 论坛巡礼 | 新兴系统软件论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

算法 全排列的应用

#include <iostream> #include <string>using namespace std;// 交换字符串中两个字符的位置 void swap(char& a, char& b) {char temp a;a b;b temp; }void fun(string str) {string a str.substr(0,4); int aa;sscanf(a.c_str(), "%d",…

Harmony 应用开发之size 脚本

作者&#xff1a;麦客奥德彪 在应用开发中&#xff0c;最终呈现在用户面前的UI&#xff0c;是用户能否继续使用应用的强力依据之一&#xff0c;在之前的开发中&#xff0c;Android 屏幕碎片化严重&#xff0c;所以出现了很多尺寸适配方案。 最小宽适配、百分比适配等等。 还有一…

知虾shopee收费,多少钱一个月

在当今电商行业的竞争激烈的环境下&#xff0c;许多商家都在寻求更好的方式来推广和销售他们的产品。这就是为什么越来越多的商家选择使用知虾shopee这样的平台来展示和销售他们的商品。但是&#xff0c;对于许多商家来说&#xff0c;他们可能会对知虾shopee的收费情况感到好奇…

MySql 计算同比、环比

一、理论 国家统计局同比、环比计算公式 增长速度是反映经济社会某一领域发展变化情况的重要数据&#xff0c;而同比和环比是反映增长速度最基础、最核心的数据指标&#xff0c;也是国际上通用的指标。在统计中&#xff0c; 同比和环比通常是同比变化率和环比变化率的简称&…

关于2023年11月25日PMI认证考试有关事项的通知

PMP项目管理学习专栏https://blog.csdn.net/xmws_it/category_10954848.html?spm1001.2014.3001.54822023年8月PMP考试成绩出炉|微思通过率95%以上-CSDN博客文章浏览阅读135次。国际注册项目管理师(PMP) 证书是项目管理领域含金量最高的职业资格证书&#xff0c;获得该资质是项…

CentOS简介、ISO类型、CentOS7安装与配置以及远程连接。

目录 1.CentOS简介 2.CentOS ISO类型 3.CentOS7安装与配置 4.远程连接 1.CentOS简介 CentOS&#xff08;Community Enterprise Operating System&#xff0c;中文意思是社区企业操作系统&#xff09;是Linux发行版之一&#xff0c;它是来自于Red Hat Enterprise Linux依照…

代码随想录算法训练营第23期60天完结总结

这六十天在自己准备中期答辩、完成中期答辩中度过了 其实挺惭愧的&#xff0c;60天里&#xff0c;每天能塌下心来的时间每日递减&#xff0c;从打卡的情况上也能看出来。最后十天都是补打卡&#xff0c;每道题都是想了几分种&#xff0c;不会就开始看解析&#xff0c;然后凭着…

微软Copilot即将对大陆开放,一起来看看都有什么好用的功能

微软发布了Copilot&#xff0c;12月1日起对大陆用户开放&#xff0c;以下是Copilot的11个新功能&#xff0c;你一定不想错过&#xff1a;1. PowerPoint&#xff1a; 将Word文档转换为演示文稿。从文件中快速创建演示文稿。通过关键幻灯片总结冗长的演示文稿。使用提示添加新的…

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制总结版(11.22)

1.任务需求 基于MS16F3211芯片实现功能一个按键通过长按可以控制当前处于亮状态的灯的亮度&#xff0c;当灯从最亮达到最暗时&#xff0c;所用时为3s。现有三盏颜色分别为红绿蓝的灯&#xff0c;在处于关机状态时红灯亮&#xff0c;处于开机状态时红灯灭。点按第一次仅绿灯亮&…

postgresql新增非空默认值字段是否需要重写表

简介&#xff1a; PostgreSQL 10 版本前表新增不带默认值的DDL不需要重写表&#xff0c;只需要更新数据字典&#xff0c;因此DDL能瞬间执行&#xff0c;如下: ALTER TABLE table_name ADD COLUMN flag text; 如果新增的字段带默认值&#xff0c;则需要重写表&#xff0c;表越大…