动态规划几个例题!!

2023-05-16

在这里插入图片描述
动态规划法!!!
dp[i][j]=true表示字符串从下标 i 到下标 j 的位置是一个回文子串(所谓的状态转移)

var longestPalindrome = function(s) {
    let len=s.length;
    let dp=[];
    for(let i=0;i<len;i++){
        dp[i]=[];
        dp[i][i]=true;
    }
    let start=0,maxlen=1;//start为开始位置,maxlen为长度
    for(let j=1;j<len;j++){
        for(let i=0;i<len-1;i++){
            if(s[i]==s[j]){
                if(j-i<=2){//在头尾字符一致时,满足回文子串的临界条件
                    dp[i][j]=true;
                }else{
                    dp[i][j]=dp[i+1][j-1];
                }
            }else{
                dp[i][j]=false;
            }
            if(dp[i][j]==true&&j-i+1>maxlen){
                maxlen=j-i+1;
                start=i;
            }
        }
    }
    return s.substr(start,maxlen);
};

扩展练习

对于一个由大写英文字母和“*”号组成的字符串,求它的最长回文子串的长度,其中一个“*”号可以用来替代任意一个字符。
// 样例输入:DAB*B*ACD
// 样例输出: 6

let s='DAB*B*ACD'
let len=s.length;
let dp=[];
let start=0,maxlen=1;
for(let i=0;i<s.length;i++){
    dp[i]=[];
    dp[i][i]=true
}
for(let j=1;j<len;j++){
    for(let i=0;i<len;i++){
        if(s[i]==s[j]||s[i]=='*'||s[j]=='*'){//只需修改此处条件即可
            if(j-i<=2){
                dp[i][j]=true;
            }else{
                dp[i][j]=dp[i+1][j-1];
            }
        }else{
            dp[i][j]=false;
        }
        if((j-i+1>maxlen)&&(dp[i][j]==true)){
            maxlen=j-i+1;
            start=i;
        }
    }
}
//console.log(s.substr(start,maxlen));
console.log(maxlen)//6

动态规划练习
在这里插入图片描述
解析:
dp[i][j]表示长度为 [0, i - 1] 的字符串 text1 与长度为 [0, j - 1] 的字符串 text2 的最长公共子序列为 dp[i][j]
(1)若当前字符相同,dp[i][j]=dp[i-1][j-1]+1
(2)若当前字符不相同,dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1])

var longestCommonSubsequence = function(text1, text2) {
    let len1=text1.length;
    let len2=text2.length;
    //初始化dp数组,len1+1行,len2+1列,并初始化为0
    let dp=Array.from(Array(len1+1),()=>Array(len2+1).fill(0));
    // 从左往右从上往下遍历,位置从1开始,方便计算dp[i][j]的值
    for(let i=1;i<=len1;i++){
        for(let j=1;j<=len2;j++){
            if(text1[i-1]==text2[j-1]){//此时字符串的位置都要-1
                dp[i][j]=dp[i-1][j-1]+1;
            }else{
                dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
            }
        }
    }
    return dp[len1][len2];
};

在这里插入图片描述
状态转移方程为 dp[n] = (dp[n-3] + dp[n-2] + dp[n-1])%(1000000007)

var waysToStep = function(n) {
    if(n<=2)return n;
    let dp=new Array(n);
    dp[0]=1,dp[1]=2,dp[2]=4;
    for(let i=3;i<n;i++){
        dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007;
    }
    return dp[n-1];
};

在这里插入图片描述

var maxSubArray = function(nums) {
    let dp=[],max=nums[0];
    dp[0]=nums[0];
    for(let i=1;i<nums.length;i++){
        if(dp[i-1]>0){
            dp[i]=nums[i]+dp[i-1];
        }else{
            dp[i]=nums[i];
        }
        max=(dp[i]>max)?dp[i]:max;
    }
    return max;
};

在这里插入图片描述
(进步:没看解题思路!)

官方的状态方程是dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]),最后的dp[len]即为最大金额

我找的状态方程是dp[i]=nums[i-1]+Math.max(dp[i-2],dp[i-3]),需要另用一个变量maxnum存放最大值,并每次比较,记录最大的那个,最后输出
(上述的nums[i-1]是因为遍历从1开始)

var rob = function(nums) {
    let len=nums.length;
    let maxnum=0;
    let dp=new Array(len+1);
    dp[0]=0;
    for(let i=1;i<=len;i++){
        if(i<3){
            dp[i]=nums[i-1];
        }else{
            dp[i]=nums[i-1]+Math.max(dp[i-2],dp[i-3]);
        }
        maxnum=(dp[i]>maxnum)?dp[i]:maxnum;
    }
    return maxnum;
};

在这里插入图片描述
状态方程为dp[i][j]=dp[i][j-1]+dp[i-1][j]

var uniquePaths = function(m, n) {
    let dp=Array.from(Array(m+1),()=>Array(n+1).fill(0));
    for(let i=1;i<=m;i++){
        for(let j=1;j<=n;j++){
            if(i==1&&j==1){
                dp[i][j]=1;
            }else{
                dp[i][j]=dp[i][j-1]+dp[i-1][j];
            }
        }
    }
    return dp[m][n]
};

在这里插入图片描述
难点:要构建两个一位数组,分别存放小于位置 i 元素的乘积(left)和大于位置 i 元素的乘积(right)
其中,分别设置两个变量 i、j,i 从起始位置开始,j 从末尾位置开始
left的状态方程:left[i]=left[i-1]*a[i-1],left[1]==1
right的状态方程:right[j]=right[j+1]*a[j+1],right[j]==1

var constructArr = function(a) {
    let left=[];//存放小于i的乘积
    let right=[];//存放大于i的乘积
    let index=0;
    for(let i=0;i<a.length;i++){
        let j=a.length-i-1;
        if(i==0&&j==a.length-1){
            left[i]=1;
            right[j]=1;
        }else{
            left[i]=left[i-1]*a[i-1];
            right[j]=right[j+1]*a[j+1];
        }       
    }
    for(let i=0;i<a.length;i++){
        a[i]=left[i]*right[i];
    }
    // console.log(left,right)
    return a;
};

在这里插入图片描述

注意,此处的状态方程与不同路径的类似,但需注意第一列和第一行的状态方程
第一行:dp[i][j]=grid[i-1][j-1]+dp[i][j-1]
第一列:dp[i][j]=grid[i-1][j-1]+dp[i-1][j]
其余:dp[i][j]=grid[i-1][j-1]+Math.min(dp[i-1][j],dp[i][j-1])

var minPathSum = function(grid) {
    let m=grid.length;
    let n=grid[0].length;
    let dp=Array.from(Array(m+1),()=>Array(n+1).fill(0));
    for(let i=1;i<=m;i++){
        for(let j=1;j<=n;j++){
            if(i==1){
                dp[i][j]=grid[i-1][j-1]+dp[i][j-1];
            }
            else if(j==1){
                dp[i][j]=grid[i-1][j-1]+dp[i-1][j];
            }
            else dp[i][j]=grid[i-1][j-1]+Math.min(dp[i-1][j],dp[i][j-1]);
        }
    }
    return dp[m][n];
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划几个例题!! 的相关文章

  • pytorch查看张量占用内存大小

    element size返回单个元素的字节大小 xff0c nelement返回元素个数 span class token keyword import span torch a span class token operator 61 s
  • MySQL8.0 集群安装 (K8S)

    尝试了很多版本的mysql镜像 xff0c 都存在这样那样的的问题 原始需求中 xff0c 需要同时支持x86 64 AMD64 和aarch64 ARM64V8 xff0c 最后找到Oracle官方出品的MySQL Server 8 0镜
  • 使用latex导出IEEE文献格式

    创建一个tex文件 xff0c 内容如下 documentclass span class token punctuation span a4paper span class token punctuation span 10pt span
  • IDEA中设置python解释器(不同虚拟环境)

    按住Ctrl 43 Shift 43 Alt 43 s xff0c 或 File gt Project Structure xff0c 在Module SDK处下拉找到对应的python解释器 xff0c 如果第一次添加python解释器
  • TF-IDF

    TF IDF xff08 term frequency inverse document frequency xff09 是一种用于信息检索与数据挖掘的常用加权技术 TF意思是词频 Term Frequency xff0c IDF意思是逆文
  • 第一次写博客-C/C++软件开发工程师需要学习哪些东西?

    学习路线概述 概述数据结构和算法操作系统计算机网络数据库设计模式 概述 作为一名本科机械电子 xff0c 研究生研究计算机视觉方向的211应届毕业生 xff0c 如何才能从事C C 43 43 软件开发类的工程师呢 xff1f 如果能有机会
  • Vue中使用v-for不能用index作为key值

    今天在改一个项目 xff0c 有一个 lt el tabs gt 的列表循环 xff0c 需要根据权限控制列表项的显示 xff0c 代码如下 xff1a span class token operator lt span template
  • java 冒泡排序 选择排序 插入排序及其异同点

    交换两坐标位置的swap 函数 之后要用到 span class token keyword public span span class token keyword static span span class token keyword
  • 自抗扰(ADRC)控制原理及控制器设计

    自抗扰控制是在PID控制算法基础上进行改进的新型控制方法 xff0c 它具有不依赖于控制对象模型 不区分系统内外扰的结构特点 常用的自抗扰控制器主要由跟踪微分器 xff08 Tracking Differentiator xff0c TD
  • LQR控制基本原理(包括Riccati方程具体推导过程)

    全状态反馈控制系统 状态反馈控制器 通过选择K xff0c 可以改变的特征值 xff0c 进而控制系统表现 LQR控制器 最优控制 xff0c 其本质就是让系统以某种最小的代价来让系统运行 xff0c 当这个代价被定义为二次泛函 xff0c
  • 运行VINS-Fusion时找不到vins_node节点的问题解决

    问题 xff1a 在执行 rosrun vins vins node span class token operator span span class token operator span catkin ws span class to
  • Faster RCNN(Pytorch版本)代码及理论笔记

    文章目录 前言一 Faster RCNN整体流程二 PASCAL VOC2012数据集1 简介2 下载方式3 文件结构及含义 三 加载数据集四 数据预处理1 流程2 标准化数据3 缩放4 将图片处理为统一尺寸5 数据预处理的输入输出 五 B
  • K8S 网络CNI

    1 简介 CNI 容器网络接口 Container Network Interface xff1a 由Google和Core OS主导制定的容器网络标准 xff0c 它仅仅是一个接口 xff0c 具体的功能由各个网络插件自己去实现 xff1
  • 二叉树-前-中-后序遍历

    二叉树 二叉树概念 xff1a 1 空树 2 非空 xff1a 根节点 xff0c 根节点的左子树 xff0c 根节点的右子树组成 注意 xff01 注意 xff01 时刻记得二叉树是根 xff0c 根的左子树 xff0c 根的右子树 xf
  • 变量的声明与定义&&内部函数与外部函数

    1 变量的声明与定义 对于函数 声明部分是对有关标识符 xff08 变量 函数 结构体 xff09 的属性进行声明 xff1b 函数的声明是函数的原型 xff0c 而函数的定义是对函数功能的定义 对被调函数的声明是放在主调函数的声明部分 x
  • 《Java面向对象编程(阿里云大学)》笔记(文档+思维导图)

    课程链接 xff1a https edu aliyun com course 1011 xff08 还是建议去看课程 xff0c 笔记仅供参考 由于文中的所有内容均为手敲 xff0c 并且有些代码并未验证 xff0c 因此如有错误 xff0
  • 《JDBC数据库开发进阶(阿里云大学》笔记(文档+思维导图)

    第1章 xff1a 事务处理 课时1 xff1a 事务的四大特性 xff08 ACID xff09 课时2 xff1a MySQL中开启和关闭事务 课时3 xff1a JDBC中完成事务处理 在JDBC中处理事务 xff0c 都是通过Con
  • PyCharm使用教程 --- 7、使用PyCharm进行DeBug调试

    很多新手朋友对PyCharm的使用无从下手 xff0c 于是花费了一点时间整理这份PyCharm操作手册 xff0c 完整PDF下载 xff1a 终于写完了 xff01 PyCharm操作手册 V1 0版本 PDF下载 目录如下 xff1a
  • FreeRTOS中断和任务之间的队列,自定义串口通讯协议

    本文提供这样一种方法 xff1a FreeRTOS中串口接收数据中断 xff0c 然后通过队列将数据传递给任务A xff0c 在任务A中对数据进行处理 xff0c 串口使用的通讯协议为自定义 依次给出了串口的初始化 中断服务函数 任务A x
  • 适用于FreeRTOS初学者,FreeRTOS整体知识框架

    写在前面 xff1a 因为实际使用需求 xff0c 学习了一段时间FreeRTOS 从FreeRTOS的市场占有率来看 xff0c 网上的资料应该很多 xff0c 但是在学习过程中尤其是遇到问题的时候 xff0c 发现真正有用的资料并不多

随机推荐

  • 串口通信float型数据的处理和发送;大端小端;联合体union占用字节大小;结构体的定义

    在介绍float型数据的处理和发送之前 xff0c 先介绍一下大端和小端以及联合体的大小分析 一 什么是大端小端 xff1f 如何测试你的CPU是大端还是小端 xff1f 1 大端小端 xff1a 小端 xff1a 采用小端模式的CPU对操
  • Python中以下划线开头的标识符

    1 以单下划线开头的变量 例如 foo代表禁止外部访问的类成员 xff0c 需通过类提供的接口进行访问 xff0c 不能用 34 from xxx import 34 导入 2 以双下划线开头的变量 例如 foo xff0c 代表类的私有成
  • 【CentOS 7】命令行安装GNOME、KDE图形界面(转载)

    目录 正文 一 进入 root 模式 二 安装 X 窗口系统 三 安装图形界面软件 GNOME 四 更新系统的默认运行级别 正文 CentOS 7 默认是没有图形化界面的 xff0c 但我们很多人在习惯了 Windows 的图形化界面之后
  • Git子模块使用教程

    Git子模块 1 问题背景 随着产品的日益增多 xff0c 各个产品之间的业务功能会出现高度的相同性 xff0c 比如产品A有串口的接收功能 xff0c 产品B也有相同的串口功能 xff0c 这类功能我们可以写成一个通用的串口接收模块 这样
  • K8S Flannel

    1 简介 Flannel 由CoreOS开发 xff0c 用于解决docker集群跨主机通讯的覆盖网络 overlay network xff0c 它的主要思路是 xff1a 预先留出一个网段 xff0c 每个主机使用其中一部分 xff0c
  • 阿里云服务器VNC使用步骤

    1 控制台设置 2 VNC桌面连接设置 yum安装太难 xff0c 不建议 分两步 xff1a 1 安装yum 2 安装VNC ubuntu 16 04中安装yum 在Ubuntu系统中按住 xff1a ctrl 43 alt 43 T 打
  • vscode 配置git

    下载git https git scm com 安装时 xff0c 直接默认所有选项安装 然后打开git安装目录 找到如下路径 打开vscode 点击文件 找到 首选项 点击设置 在搜索框搜索 git path 编辑settings jso
  • Intel D405 运行环境——Realsense-viewer

    第一章 Intel D405 运行环境 Realsense viewer 文章目录 第一章 Intel D405 运行环境 Realsense viewer一 开盲盒二 ubuntu环境下的realsense viewer安装 一 开盲盒
  • linux arm64 中断处理流程完整分析 (一)—— 中断向量表、中断处理流程汇编部分

    中断流程老生常谈 xff0c 但我一直以来也只是知道中断过来之后 xff0c 会保护现场 xff0c 跳到中断向量表 xff0c 执行中断 xff0c 恢复现场 xff0c 然后返回 至于更多细节 xff0c 就不得而知了 这篇文章旨在把更
  • ubuntu apt-get update 失败 server certificate verification failed

    报错提示解决方法step 1step 2step 3 报错提示 执行sudo apt get update时 xff0c 报错如下 Ign 188 https mirrors tuna tsinghua edu cn ubuntu xeni
  • mySQL创建数据库和数据表

    SQL 的主要功能是和数据库建立连接 xff0c 进行增删改查的操作 SQL是关系型数据库管理系统的标准语言 SQL 语言的作用 xff1a 数据定义语言 DDL Data Definition Language 用于创建数据库 xff0c
  • C++刷过的笔试题知识点

    函数若无返回值 xff0c 则它一定无形参 X 析构函数可以有参数 xff0c 但没有返回值 某32位系统下 C 43 43 程序void p 61 malloc 100 sizeof xff08 p xff09 61 4 xff1f 指针
  • 5-字符串

    1 字符串基础 1 1 定义字符串 通过String构造函数构造的字符串与字符串直接量的类型不同 前者为引用对象 xff0c 后者为值类型的字符串 span class token keyword var span s1 span clas
  • 没有Android SDK选项的解决办法+修改Android Studio中的Sdk路径

    安装教程 安装Android Studio时没有Android SDK选项 xff0c 可以先不管 xff0c 继续安装 注意在安装的过程中 xff0c 应该在最后一步install时 xff0c 会出现一个sdk的位置 比如我的在C Us
  • Android Studio一直在Download https://services.gradle.org/distributions/gradle-5.4.1-all.zip的解决方法

    Android Studio的新建工程下面一直出现Download https services gradle org distributions gradle 5 4 1 all zip 解决方法 xff1a 去https service
  • TDEngine 集群安装 (K8S)

    1 构建镜像 1 1 entrypoint sh span class token shebang important bin bash span span class token builtin class name set span 4
  • 设置Android Studio中的模拟器

    怎么设置Android Studio中的模拟器 xff0c 下面记录一下大概流程 然后自己选择设备 xff0c next 下好了之后next 建立后可能会出现以下图片所示问题 位于 的ADB二进制文件已过时 xff0c 并且在Android
  • 算法题算法题!!!!

    0223 思路 xff1a 先计算出老板没控制自己的情绪时的满意数量sum xff0c 再根据X的值 xff0c 维护一个滑动窗口 xff0c 遍历grumpy数组 xff0c 计算增加的满意数量add xff0c 选取最大的一个 xff0
  • MongoDB使用教程

    1 下载 xff1a https www mongodb com try download community 2 安装 解压下载包后正常步骤安装 创建服务 e Application develop MongoDB bin为路径 data
  • 动态规划几个例题!!

    动态规划法 xff01 xff01 xff01 dp i j 61 true表示字符串从下标 i 到下标 j 的位置是一个回文子串 xff08 所谓的状态转移 xff09 span class token keyword var span