动态规划 - 背包问题 回文串分割

news/2024/5/17 18:46:54/文章来源:https://blog.csdn.net/xaiobit_hl/article/details/126818224

目录

1.背包问题

1.1 题目描述

1.2 画图分析

1.3 思路分析

1.4 代码示例

2. 回文串分割

2.1 题目描述

2.2 思路分析

2.3 代码示例


1.背包问题

1.1 题目描述

有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小
和数组 V 表示每个物品的价值.问最多能装入背包的总价值是多大?1.A[i], V[i], n, m 均为整数
2.你不能将物品进行切分
3.你所挑选的要装入背包的物品的总大小不能超过 m
4.每个物品只能取一次
5.m <= 1000
len(A),len(V)<=100

1.2 画图分析

  • 第 i 个商品放入包中的价值

此时两个等式其实都可以由 F(i, j) = F(i - 1, j - a[i -1]) + v[i -1]  来代替 

  •  第 i 个商品的大小 > 包的大小

此时 F(i, j) = F(i - 1, j) 

1.3 思路分析

状态 F(i, j):从前 i 个商品中选择,包的大小为 j 时的最大价值。(商品的索引从 1 开始,数组的索引从 0 开始)

状态转移方程:

  • a[i - 1]  >  j             F(i, j) = F(i - 1, j)
  • a[i - 1] <= j             F(i, j) = F(i - 1, j - a[i - 1]) + v[i - 1]

初始状态F(i, 0) = F(0, j) = 0,由于每一个商品的价值都可能和前一行的某一列有关,为了防止数组越界,我们申请一个行,列比商品数、包都大一的二维数组 array[n + 1][m + 1].

返回结果array[n][m].

结合具体示例理解:

 

1.4 代码示例

public class Solution {public static int backPackII(int m, int[] a, int[] v) {int number = a.length;int[][] array = new int[number + 1][m + 1];// 初始状态 array[0][j] = array[i][0] = 0for(int i = 1; i < number + 1; i++) {for(int j = 1; j < m + 1; j++) {// 状态转移方程if(a[i - 1] > j) {array[i][j] = array[i - 1][j];} else {array[i][j] = Math.max(array[i -1][j], array[i - 1][j - a[i - 1]] + v[i - 1]);}}}// 返回结果return array[number][m];}
}

【优化】一维数组

上述代码可以优化为只用一个一维数组,循环还是两层,但是要注意的是:内层循环需要从后往前走,因为状态方程需要用未更新之前的值,如果从小到大更新的话,我们是先更新前面这些列的值,那么后面使用的就都是更新过的值了;但是对于二维数组,从前往后,从后往前都是可以的。

public class Solution {public int backPackII(int m, int[] a, int[] v) {int number = a.length;// 省去行int[] array = new int[m + 1];for(int i = 1; i < number + 1; i++) {// 注意从后往前更新for(int j = m; j > 0; j--) {if(a[i - 1] <= j) {// 状态转移方程array[j] = Math.max(array[j], array[j - a[i - 1]] + v[i - 1]);}}}return array[m];}
}

2. 回文串分割

2.1 题目描述

给出一个字符串s,分割s使得分割出的每一个子串都是回文串
计算将字符串s分割成回文分割结果的最小切割数
例如:给定字符串s="aab",
返回1,因为回文分割结果["aa","b"]是切割一次生成的。

示例1:

输入:"aab"
返回值:1

2.2 思路分析

问题:s 的最小分割次数

状态 F(i) :s 的前 i 个字符最小的分割次数

状态转移方程:

  • [1, i] 是回文串      array[i] = 0;
  • [1, i] 不是回文串,且 i < j && [j + 1, i] 是回文串        min(F(i), F(j) + 1);

初始状态:F(i) = i - 1i  从 1 开始

返回结果:F(s.length())

结合具体实例理解 min(F(i), F(j) + 1)  :

 

2.3 代码示例

public class Solution {public boolean isPal(String s) {int left = 0;int right = s.length() - 1;while(left < right) {if(s.charAt(left) != s.charAt(right)) {return false;}left++;right--;}return true;}public int minCut (String s) {if(s.length() == 0 || s.length() == 1) {return 0;}int[] array = new int[s.length() + 1];// 初始状态for(int i = 1; i < array.length; i++) {array[i] = i - 1;}for(int i = 2; i < array.length; i++) {// 判断整体是否为回文串if(isPal(s.substring(0,i))) {array[i] = 0;} else {for(int j = 1; j < i; j++) {// j < i && [j + 1, i] 是否为回文串if(isPal(s.substring(j, i))) {// 状态转移方程array[i] = Math.min(array[i], array[j] + 1);}}}}return array[s.length()];}
}

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

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

相关文章

ROS+Arduino学习导航贴

前言 原先写了一些ROSarduino学习记录的帖子&#xff0c;发现每次找起来非常麻烦&#xff0c;所以做一个汇总帖&#xff0c;以后需要的话&#xff0c;找起来就方便了。 关于我用的开发板&#xff0c;一开始学习的时候&#xff0c;我用的开发板是arduino uno这类的&#xff0c…

[笔记]MySQL 插入导致死锁

线上遇到的 MySQL 插入导致死锁,问题排查. 场景复现 MySQL 版本: 5.7.36 数据库存储引擎: InnoDB 事务隔离级别: REPEATABLE-READ 1. 创建测试表 DROP TABLE IF EXISTS tb_task; CREATE TABLE tb_task (id int(11) NOT NULL AUTO_INCREMENT,task_id int(11),order_id int(1…

猿创征文 |【数据结构】2个例题带你理解图的遍历:广度优先搜索

目录 1、定义 2、算法分析 3、算法实现 4、性能分析 &#x1f49f;作者简介&#xff1a;大家好呀&#xff01;我是路遥叶子&#xff0c;大家可以叫我叶子哦&#xff01;❣️ &#x1f4dd;个人主页&#xff1a;【叶子博客】 &#x1f3c6;博主信息&#xff1a;四季轮换…

jquery实现云音乐歌词高亮和自动滚动效果

书接上篇文章 实现效果&#xff1a; 一、歌词高亮 首先要判断当前歌词和播放器的当前时间 循环歌词数组treatLyrics&#xff0c;拿到每条歌词的时间与播放器的当前时间playAudio.currentTime进行比较 treatLyrics.forEach((i, index) > { // console.log(i); // console.…

目前最好用的NAS系统是什么?

NAS被定义为一种特殊的专用数据存储服务器&#xff0c;包括存储器件&#xff08;例如磁盘阵列、CD/DVD驱动器、磁带驱动器或可移动的存储介质&#xff09;和内嵌系统软件&#xff0c;那么目前最好用的nas系统是什么&#xff1f; 常见的NAS系统有哪些 Nas 系统一般都是基于 Li…

Uplink Resource Allocation in IEEE 802.11ax

一、基本信息 题目&#xff1a;IEEE 802.11ax中的上行链路资源分配 作者&#xff1a;Sudeep Bhattarai, Gaurang Naik, Jung-Min (Jerry) Park 摘要&#xff1a;MU-OFDMA使得多个用户可以在更小的子信道(即资源单元&#xff0c;RUs)中同时进行传输&#xff0c;从而提高802.11ax…

如何从零开始解读产品经理行业分析

上次一起了解了什么是产品经理&#xff0c;产品经理PM和PD在不同类型公司的作用。了解产品经理对当前的应用产品中的重要作用。是不是有点憧憬&#xff0c;其实憧憬是美好的&#xff0c;但是还是要走进现实具体怎么去做&#xff0c;一步一步脚踏实地的&#xff0c;一步一步走入…

【Linux入门】— 腾讯云服务器的搭建

꧁ 各位大佬们好&#xff01;很荣幸能够得到您的访问&#xff0c;让我们一起在编程道路上任重道远&#xff01;꧂ ☙ 博客专栏&#xff1a;【Linux知识】❧ ⛅ 本篇内容简介&#xff1a;Linux小白到精通 — 学好Linux从学会服务器搭建开始&#xff01; ⭐ 了解作者&#xff1…

Java操作Zookeeper框架

Zookeeper框架 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hb…

Java Double equals()方法具有什么功能呢?

转自: Java Double equals()方法具有什么功能呢&#xff1f; 下文笔者将讲述equals()方法的功能简介说明&#xff0c;如下所示: equals()方法的功能 java.lang.Double.equals()方法的功能: 将当前的Double对象同一个对象进行比较&#xff0c; 当Object是一个Double对象&…

【牛客 - 剑指offer】JZ8 二叉树的下一个结点 Java实现

文章目录剑指offer题解汇总 Java实现本题链接题目方案一 中序遍历递归代码一 设置flag标记代码二 获取整个arrayList的大小方案二 分类直接寻找&#xff08;分情况讨论&#xff09;思路代码&#xff08;版本一&#xff09;代码&#xff08;版本二&#xff09;剑指offer题解汇总…

计算机毕业设计成品java项目开发实例SSM+MySQL实现的家庭医生预约平台

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 一、项目介绍 二、项目截图 三、项目获取 一、项目介绍 java毕业设计计算机毕设项目之基于SSMMySQL实现的家庭医生预约平台_哔哩哔哩_bilibilijava毕业设计计算机毕设项目之基于SSMMyS…

记首次协助搭建服务器

一&#xff0c;服务器资源申请 1&#xff09;使用云服务器&#xff08;k8s&#xff09;还是IDC服务器 云服务器VS IDC服务器 不同&#xff1a; 费用一样&#xff0c;云服务器支持动态扩容 私有云和IDC没有很大区别&#xff0c;只是私有云支持k8s&#xff0c;动态扩容方便。…

python 日志处理(基础篇)

Logging处理 日志级别等级排序&#xff1a;critical > error > warning > info > debug debug : 打印全部的日志( notset 等同于 debug ) info : 打印 info, warning, error, critical 级别的日志 warning : 打印 warning, error, critical 级别的日志 error : 打…

笑霸餐厅 | 瑞吉外卖项目 | 完整基础部分(后端学习笔记)

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;项目专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

Android ActionBar

android的ActionBar是3.0才推出的,3.0之前称之为AppBar。为了向后兼容,ActionBar位于Android的支持库AppCompat中,所以要使用ActionBar先必须依赖AppCompat库(现在新建的工程默认都依赖此库了)implementation androidx.appcompat:appcompat:1.3.0如果没有在主题Theme中或Ac…

【小月电子】安路国产FPGA开发板系统学习教程-LESSON6按键消抖

按键消抖例程讲解若要观看该博客配套的视频教程&#xff0c;可点击此链接根据多年工作经验&#xff0c;总结出的FPGA的设计流程&#xff0c;概括起来总共有以上12步&#xff0c;其中根据项目难易度可省去其中一些步骤。比如非常简单的项目&#xff0c;我们可以省去虚线框里面的…

java基于微信小程序的电影院购票选座 uniapp 小程序

随着移动应用技术的发展,越来越多的用户借助于移动手机、电脑完成生活中的事务,许多的传统行业也更加重视与互联网的结合,由于城镇人口的增加,人们去电影院总是排着长长的队伍,对于时间紧的人是一个非常头痛的事情,有的人可能就是排队也要用去半天时间,人们为了缓解排队就购票的…

TFT-eSPI入门使用教程

一、准备资料开发板:ESP32-S3 屏驱动是:ST7789_DRIVER 开发环境:VS Code + PlatformIO注意:以上是我使用的环境,不一定需要和是使用的东西一样,这里主要是学习TFT-eSPI开源驱 二、获取TFT-eSPI GitHub:https://github.com/Bodmer/TFT_eSPI 三、配置User_Setup.h文件 在路…

【软件与系统安全笔记】二、软件与系统安全基础

【软件与系统安全】二、软件与系统安全基础 这是《【软件与系统安全】笔记与期末复习》系列中的一篇 2022-01-17 第二次课 2022-02-21 第三次课前部分 计算机安全的目标&#xff1a; 防止信息“遭遇不测事件”, 但不能阻止“好的事情”发生&#xff08;“好的事情”包括功能性…