当前位置: 首页 > news >正文

【LeetCode Hot100 多维动态规划】最小路径和、最长回文子串、最长公共子序列、编辑距离

多维动态规划

  • 机器人路径问题
    • 思路
    • 代码实现
  • 最小路径和问题
    • 动态规划思路
      • 状态转移方程
      • 边界条件
    • 代码实现
  • 最长回文子串
    • 思路
    • 代码实现
  • 最长公共子序列(LCS)
    • 题目描述
    • 解决方案 —— 动态规划
      • 1. 状态定义
      • 2. 状态转移方程
      • 3. 初始化
      • 4. 代码实现
  • 编辑距离(Edit Distance)
    • 题目描述
    • 解法:动态规划
      • 状态转移方程
      • 边界条件
    • 代码实现
  • 二维动态规划答题总结
    • 1. 识别动态规划问题
    • 2. 解决二维 DP 题目的通用步骤
      • Step 1: 定义 DP 数组
      • Step 2: 确定状态转移方程
      • Step 3: 初始化边界条件
      • Step 4: 计算 DP 数
      • Step 5: 优化空间复杂度
    • 3. 典型题目总结

机器人路径问题

给定一个 ( m × n ) ( m \times n ) (m×n) 的网格,机器人位于左上角(起始点 “Start”),只能向下或者向右移动一步,目标是到达右下角(终点 “Finish”)。求总共有多少条不同的路径?


思路

  1. 状态定义
    用二维数组 dp[i][j] 表示到达网格中位置 ( i , j ) (i, j) (i,j) 的不同路径数。

  2. 状态转移
    由于机器人只能从上方或左侧移动到 ( i , j ) (i, j) (i,j)
    [ d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] ] [ dp[i][j] = dp[i-1][j] + dp[i][j-1] ] [dp[i][j]=dp[i1][j]+dp[i][j1]]

  3. 初始化

    • 起点:dp[0][0] = 1
    • 第一行 ( i = 0 ) (i = 0) (i=0)上的所有位置只能从左边到达,因此路径数均为 1。
    • 第一列 ( j = 0 ) (j = 0) (j=0)上的所有位置只能从上面到达,因此路径数均为 1。
  4. 答案
    最终答案为 dp[m-1][n-1]

代码实现

class Solution {public int uniquePaths(int m, int n) {// 创建一个 m x n 的二维数组 dp,用于记录每个位置的路径数int[][] dp = new int[m][n];// 初始化第一列,每个位置只有一种路径(一直向下走)for (int i = 0; i < m; i++) {dp[i][0] = 1;}// 初始化第一行,每个位置只有一种路径(一直向右走)for (int j = 0; j < n; j++) {dp[0][j] = 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 - 1][n - 1];}
}

最小路径和问题

给定一个包含非负整数的 ( m × n ) ( m \times n ) (m×n) 网格 grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。


动态规划思路

我们可以使用动态规划来解决这个问题,定义状态 dp[i][j] 表示从起点 ((0, 0)) 到达位置 ((i, j)) 的最小路径和。

状态转移方程

  • 对于位置 ( i , j ) (i, j) (i,j),由于只能从上方 ( i − 1 , j ) (i-1, j) (i1,j) 或左侧 ( i , j − 1 ) (i, j-1) (i,j1) 移动过来,因此有:
    d p [ i ] [ j ] = g r i d [ i ] [ j ] + min ⁡ ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) dp[i][j] = grid[i][j] + \min(dp[i-1][j],\ dp[i][j-1]) dp[i][j]=grid[i][j]+min(dp[i1][j], dp[i][j1])

边界条件

  • 起点
    d p [ 0 ] [ 0 ] = g r i d [ 0 ] [ 0 ] dp[0][0] = grid[0][0] dp[0][0]=grid[0][0]
  • 第一行
    只能从左侧移动,所以:
    d p [ 0 ] [ j ] = d p [ 0 ] [ j − 1 ] + g r i d [ 0 ] [ j ] (对于  j ≥ 1 ) dp[0][j] = dp[0][j-1] + grid[0][j] \quad \text{(对于 } j \ge 1\text{)} dp[0][j]=dp[0][j1]+grid[0][j](对于 j1)
  • 第一列
    只能从上面移动,所以:
    d p [ i ] [ 0 ] = d p [ i − 1 ] [ 0 ] + g r i d [ i ] [ 0 ] (对于  i ≥ 1 ) dp[i][0] = dp[i-1][0] + grid[i][0] \quad \text{(对于 } i \ge 1\text{)} dp[i][0]=dp[i1][0]+grid[i][0](对于 i1)

代码实现

下面是基于上述思路的 Java 代码实现:

class Solution {public int minPathSum(int[][] grid) {int m = grid.length;int n = grid[0].length;// 创建 dp 数组,dp[i][j] 表示到达 (i, j) 的最小路径和int[][] dp = new int[m][n];// 初始化起点dp[0][0] = grid[0][0];// 初始化第一行for (int j = 1; j < n; j++) {dp[0][j] = dp[0][j - 1] + grid[0][j];}// 初始化第一列for (int i = 1; i < m; i++) {dp[i][0] = dp[i - 1][0] + grid[i][0];}// 填充 dp 数组的剩余部分for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = grid[i][j] + Math.min(dp[i - 1][j], dp[i][j - 1]);}}// 返回右下角的最小路径和return dp[m - 1][n - 1];}
}

最长回文子串

给定一个字符串 s,找出 s 中最长的回文子串。


思路

我们可以利用动态规划来解决该问题。设 dp[i][j] 表示子串 s[i...j] 是否为回文。状态转移方程为:

d p [ i ] [ j ] = ( s [ i ] = = s [ j ] ) & & ( j − i < 3 或  d p [ i + 1 ] [ j − 1 ] ) dp[i][j] = (s[i] == s[j]) \, \&\& \, (j - i < 3 \text{ 或 } dp[i+1][j-1]) dp[i][j]=(s[i]==s[j])&&(ji<3  dp[i+1][j1])

具体说明如下:

  • s[i]s[j] 不相等时,s[i...j] 不是回文,故 dp[i][j] = false
  • s[i]s[j] 相等时:
    • 如果子串长度小于等于 3(即 j - i < 3),那么 s[i...j] 一定是回文,因为此时中间最多只有一个字符。
    • 如果子串长度大于 3,则需依赖子串 s[i+1...j-1] 是否为回文,即 dp[i+1][j-1]

在更新过程中,我们记录当前最长回文子串的起始位置和长度,最终返回最长的回文子串。


代码实现

class Solution {public String longestPalindrome(String s) {int n = s.length();if (n < 2) return s; // 如果字符串长度小于 2,直接返回 s// dp[i][j] 表示 s[i...j] 是否为回文子串boolean[][] dp = new boolean[n][n];int maxLen = 1;  // 记录最长回文子串的长度int start = 0;   // 记录最长回文子串的起始位置// 所有单个字符都是回文子串for (int i = 0; i < n; i++) {dp[i][i] = true;}// 枚举子串的结束位置 j,从 1 到 n-1for (int j = 1; j < n; j++) {// 枚举子串的起始位置 i,从 0 到 j-1for (int i = 0; i < j; i++) {if (s.charAt(i) == s.charAt(j)) {// 如果子串长度小于等于 3,则必为回文;否则看内部子串是否为回文if (j - i < 3) {dp[i][j] = true;} else {dp[i][j] = dp[i + 1][j - 1];}} else {dp[i][j] = false;}// 如果 dp[i][j] 为 true 且子串长度大于当前记录的最长长度,则更新结果if (dp[i][j] && j - i + 1 > maxLen) {maxLen = j - i + 1;start = i;}}}return s.substring(start, start + maxLen);}
}

最长公共子序列(LCS)

题目描述

给定两个字符串 text1text2,返回它们的 最长公共子序列(LCS)的长度。如果不存在公共子序列,则返回 0

定义:

  • 子序列:从字符串中删除某些字符(也可以不删除),但不改变字符的相对顺序后形成的新字符串。
  • 公共子序列:同时属于 text1text2 的子序列。

解决方案 —— 动态规划

1. 状态定义

dp[i][j] 表示 text1[0:i]text2[0:j] 的最长公共子序列的长度。

2. 状态转移方程

  • text1[i-1] == text2[j-1](即当前字符相同):
    d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j] = dp[i-1][j-1] + 1 dp[i][j]=dp[i1][j1]+1
  • text1[i-1] != text2[j-1](即当前字符不同):
    d p [ i ] [ j ] = max ⁡ ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) dp[i][j] = \max(dp[i-1][j], dp[i][j-1]) dp[i][j]=max(dp[i1][j],dp[i][j1])
    取两种删除策略的最大值:
    • dp[i-1][j]:删除 text1 的当前字符
    • dp[i][j-1]:删除 text2 的当前字符

3. 初始化

  • dp[0][j] = 0(空字符串 text1text2 的最长公共子序列长度为 0)
  • dp[i][0] = 0(同理)

4. 代码实现

class Solution {public int longestCommonSubsequence(String text1, String text2) {int m = text1.length(), n = text2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (text1.charAt(i - 1) == text2.charAt(j - 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[m][n];}
}

dp 数组大小是 (m+1) × (n+1),是为了处理空字符串,避免 dp[i-1][j-1] 边界问题。
这样可以统一状态转移方程,减少边界检查,提高代码的可读性和稳定性。

编辑距离(Edit Distance)

题目描述

给定两个单词 word1word2,请返回将 word1 转换成 word2 所使用的最少操作数。

可以对一个单词进行如下三种操作:

  1. 插入一个字符
  2. 删除一个字符
  3. 替换一个字符

解法:动态规划

我们定义 dp[i][j]word1[0:i] 转换为 word2[0:j] 所需的最少操作数

状态转移方程

  1. 如果 word1[i-1] == word2[j-1](即当前字符相同),则不需要额外操作:
    d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i1][j1]

  2. 如果 word1[i-1] ≠ word2[j-1](即当前字符不同),可以执行三种操作:

    • 插入字符dp[i][j-1] + 1):相当于在 word1 插入 word2[j-1],这样 word1[0:i] 变成 word2[0:j]
    • 删除字符dp[i-1][j] + 1):相当于删除 word1[i-1],这样 word1[0:i-1] 变成 word2[0:j]
    • 替换字符dp[i-1][j-1] + 1):将 word1[i-1] 变成 word2[j-1],这样 word1[0:i] 变成 word2[0:j]

    取三者最小值:
    d p [ i ] [ j ] = min ⁡ ( d p [ i − 1 ] [ j − 1 ] + 1 , d p [ i ] [ j − 1 ] + 1 , d p [ i − 1 ] [ j ] + 1 ) dp[i][j] = \min(dp[i-1][j-1] + 1, \quad dp[i][j-1] + 1, \quad dp[i-1][j] + 1) dp[i][j]=min(dp[i1][j1]+1,dp[i][j1]+1,dp[i1][j]+1)

边界条件

  • dp[0][j] = jword1 为空,需要插入 j 个字符)
  • dp[i][0] = iword2 为空,需要删除 i 个字符)

代码实现

class Solution {public int minDistance(String word1, String word2) {int m = word1.length(), n = word2.length();int[][] dp = new int[m + 1][n + 1];// 初始化边界条件for (int i = 0; i <= m; i++) dp[i][0] = i;for (int j = 0; j <= n; j++) dp[0][j] = j;// 计算 dp 数组for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1]; // 无需操作} else {dp[i][j] = Math.min(dp[i - 1][j - 1],  // 替换Math.min(dp[i - 1][j],  // 删除dp[i][j - 1])) + 1; // 插入}}}return dp[m][n];}
}

二维动态规划答题总结

1. 识别动态规划问题

当问题具有以下特征时,可以考虑使用动态规划(Dynamic Programming, DP):

  • 最优子结构(Optimal Substructure):问题可以拆解成子问题,且子问题的最优解可以构成原问题的最优解。
  • 重叠子问题(Overlapping Subproblems):子问题在递归求解过程中被多次计算。
  • 状态转移(State Transition):能够从小规模问题推导出大规模问题的解。

对于 二维动态规划,通常涉及两个字符串(或两个维度的数据),例如:

  • 子序列问题(如最长公共子序列 LCS)
  • 子数组/子矩阵问题(如最小路径和、最大乘积子数组)
  • 字符串编辑问题(如编辑距离)

2. 解决二维 DP 题目的通用步骤

Step 1: 定义 DP 数组

确定 dp[i][j] 的含义,一般是:

  • 字符串匹配问题dp[i][j] 代表 text1[0:i]text2[0:j] 的匹配结果(如最长公共子序列)。
  • 路径问题dp[i][j] 代表到达 grid[i][j] 的最优解(如最短路径)。
  • 编辑距离dp[i][j] 代表 word1[0:i] 变成 word2[0:j] 的最少操作次数。

Step 2: 确定状态转移方程

一般来说,状态转移方程由以下情况组成:

  1. 字符匹配时的继承状态:如 dp[i][j] = dp[i-1][j-1](最长公共子序列)。
  2. 考虑不同操作的最优值
    • 取最小值(如 min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1)。
    • 取最大值(如 max(dp[i-1][j], dp[i][j-1]))。
    • 取累积值(如 dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1]))。

Step 3: 初始化边界条件

不同问题的边界初始化方式不同,常见情况:

  • 子序列问题
    • dp[i][0] = 0,因为空串与任何串的 LCS 都是 0。
    • dp[0][j] = 0,因为空串与任何串的 LCS 都是 0。
  • 路径问题
    • dp[0][j] 为前缀和(只能从左走)。
    • dp[i][0] 为前缀和(只能从上走)。
  • 编辑距离问题
    • dp[i][0] = i,表示 word1 变成空串需要 i 次删除。
    • dp[0][j] = j,表示空串变成 word2 需要 j 次插入。

Step 4: 计算 DP 数

  • 通过 两层循环 计算 dp[i][j](通常是 O(m × n))。
  • 先遍历 ,依赖于状态转移方程。

Step 5: 优化空间复杂度

通常二维 DP 使用 O(m × n) 的空间,可以优化至 O(n) 甚至 O(1)

  • 滚动数组:用两个数组 prevcurr 代替整个 dp 矩阵(适用于 LCS、编辑距离)。
  • 原地修改:如果问题允许,我们可以在原数组上修改(适用于路径问题)。

3. 典型题目总结

题目状态定义状态转移方程时间复杂度空间优化
最长公共子序列(LCS)dp[i][j] 代表 text1[0:i]text2[0:j] 的 LCS 长度dp[i][j] = dp[i-1][j-1] + 1(匹配)或 max(dp[i-1][j], dp[i][j-1])O(m × n)O(n)
编辑距离(Edit Distance)dp[i][j] 代表 word1[0:i] 变成 word2[0:j] 的最少操作次数dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1O(m × n)O(n)
最小路径和dp[i][j] 代表到达 grid[i][j] 的最小路径和dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])O(m × n)O(n)
最长回文子串(中心扩展或 DP)dp[i][j] 代表 s[i:j] 是否是回文dp[i][j] = (s[i] == s[j] && dp[i+1][j-1])O(n²)O(n²) → O(1)

相关文章:

【LeetCode Hot100 多维动态规划】最小路径和、最长回文子串、最长公共子序列、编辑距离

多维动态规划 机器人路径问题思路代码实现 最小路径和问题动态规划思路状态转移方程边界条件 代码实现 最长回文子串思路代码实现 最长公共子序列&#xff08;LCS&#xff09;题目描述解决方案 —— 动态规划1. 状态定义2. 状态转移方程3. 初始化4. 代码实现 编辑距离&#xff…...

PRC框架-Dubbo

RPC框架 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架是一种允许客户端通过网络调用服务器端程序的技术。以下是常见的RPC框架及其特点&#xff1a; 1. 基于HTTP/REST的RPC框架 特点&#xff1a;简单易用&#xff0c;与Web开发无缝集成&am…...

智能检测摄像头模块在客流统计中的应用

工作原理 基于视频分析技术&#xff1a;智能检测摄像头模块通过捕捉监控区域内的视频画面&#xff0c;运用图像识别算法对视频中的人体进行检测、跟踪和分析。可以识别出人体的轮廓、姿态等特征&#xff0c;进而区分不同的个体&#xff0c;实现对客流的统计。 基于红外感应技…...

[LLM面试题] 指示微调(Prompt-tuning)与 Prefix-tuning区别

一、提示调整(Prompt Tuning) Prompt Tuning是一种通过改变输入提示语&#xff08;input prompt&#xff09;以获得更优模型效果的技术。举个例子&#xff0c;如果我们想将一条英语句子翻译成德语&#xff0c;可以采用多种不同的方式向模型提问&#xff0c;如下图所示&#xf…...

【CubeMX+STM32】SD卡 U盘文件系统 USB+FATFS

本篇&#xff0c;将使用CubeMXKeil, 创建一个 USBTF卡存储FatFS 的虚拟U盘读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA FatFs USB 三、Keil 编辑代码 四、实验效果 串口助手&#xff0c;实现效果&#xff1a; U盘&#xff0c;识别效果&#xff1a; 一、简述 上…...

在JVM的栈(虚拟机栈)中,除了栈帧(Stack Frame)还有什么?

在JVM的栈&#xff08;虚拟机栈&#xff09;中&#xff0c;除了栈帧&#xff08;Stack Frame&#xff09;&#xff0c;还有其他一些与方法调用相关的重要信息。栈的主要作用是存储方法调用的执行过程中的上下文信息&#xff0c;栈帧是其中最关键的组成部分。 栈的组成 栈帧&am…...

# 解析Excel文件:处理Excel xlsx file not supported错误 [特殊字符]

解析Excel文件&#xff1a;处理Excel xlsx file not supported错误 &#x1f9e9; 嘿&#xff0c;数据分析的小伙伴们&#xff01;&#x1f44b; 我知道在处理Excel文件的时候&#xff0c;很多人可能会遇到这样一个错误&#xff1a;Excel xlsx file not supported。别担心&…...

图片下载不下来?即便点了另存为也无法下载?两种方法教你百分之百下载下来

前言&#xff0c;我要讲的是网站没有禁鼠标右键&#xff0c;可以右键&#xff0c;也可以打开控制台&#xff0c;图片也不用付费这种。 一、用鼠标按住图片直接往桌面拖动&#xff0c;也可以打开开发者工具&#xff0c;在里面往外拖。 二、这个方法很有意思&#xff0c;在电脑的…...

Unity项目实战-Player玩家控制脚本实现

玩家控制脚本设计思路 1. 代码演变过程 1.1 初始阶段&#xff1a;单一Player类实现 最初的设计可能是一个包含所有功能的Player类&#xff1a; public class Player : MonoBehaviour {private CharacterController controller;private Animator animator;[SerializeField] …...

CP AUTOSAR标准之ICUDriver(AUTOSAR_SWS_ICUDriver)(更新中……)

1 简介和功能概述 该规范指定了AUTOSAR基础软件模块ICU驱动程序的功能、API和配置。   ICU驱动程序是一个使用输入捕获单元(ICU)来解调PWM信号、计数脉冲、测量频率和占空比、生成简单中断和唤醒中断的模块。   ICU驱动程序提供服务 信号边缘通知控制唤醒中断周期信号时间测…...

Python3 ImportError: cannot import name ‘XXX‘ from ‘XXX‘

个人博客地址&#xff1a;Python3 ImportError: cannot import name XXX from XXX | 一张假钞的真实世界 例如如下错误&#xff1a; $ python3 git.py Traceback (most recent call last):File "git.py", line 1, in <module>from git import RepoFile &quo…...

[学习笔记] Kotlin Compose-Multiplatform

Compose-Multiplatform 原文&#xff1a;https://github.com/zimoyin/StudyNotes-master/blob/master/compose-multiplatform/compose.md Compose Multiplatform 是 JetBrains 为桌面平台&#xff08;macOS&#xff0c;Linux&#xff0c;Windows&#xff09;和Web编写Kotlin UI…...

【R语言】t检验

t检验&#xff08;t-test&#xff09;是用于比较两个样本均值是否存在显著差异的一种统计方法。 t.test()函数的调用格式&#xff1a; t.test(x, yNULL, alternativec("two.sided", "less", "greater"), mu0, pairedFALSE, var.equalFALSE, co…...

flutter ListView Item复用源码解析

Flutter 的 ListView 的 Item 复用机制是其高性能列表渲染的核心&#xff0c;底层实现依赖于 Flutter 的渲染管线、Element 树和 Widget 树的协调机制。以下是 ListView 复用机制的源码级解析&#xff0c;结合关键类和核心逻辑进行分析。 1. ListView 的底层结构 ListView 的复…...

Spring Boot 配置 Mybatis 读写分离

JPA 的读写分离配置不能应用在 Mybatis 上, 所以 Mybatis 要单独处理 为了不影响原有代码, 使用了增加拦截器的方式, 在拦截器里根据 SQL 的 CRUD 来路由到不同的数据源 需要单独增加Mybatis的配置 Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) t…...

网络初识-

网络的相关概念 一、局域网和广域网 将各种计算机、外部设备等相互连接起来&#xff0c;实现在这个范围内数据通信和资源共享的计算机网络。它的覆盖范围通常在几百米到几公里之内。例如&#xff0c;一个小型企业的办公室&#xff0c;通过交换机将多台电脑连接在一起&#xf…...

DNS污染:网络世界的“隐形劫持”与防御

在互联网的底层架构中&#xff0c;DNS&#xff08;域名系统&#xff09;如同数字世界的“导航员”&#xff0c;将用户输入的域名翻译成机器可读的IP地址。然而&#xff0c;DNS污染&#xff08;DNS Poisoning&#xff09;正像一场无声的“地址篡改”危机&#xff0c;威胁着全球网…...

MQTT(Message Queuing Telemetry Transport)协议(三)

主题是什么 2. TCP 协议封装 tcp.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>// 建立 TCP 连接 int tcp_connect(const char *server_ip, int s…...

多核cpu与时间片多线程的问题

在多核处理器中&#xff0c;每个核心可以独立运行一个线程。操作系统负责管理和调度这些线程&#xff0c;以确保高效利用处理器资源。下面详细解释如何获取时间片以及四个线程如何在四个核心上同时工作。 ### 时间片和调度 #### 1. 时间片&#xff08;Time Slice&#xff09;…...

电脑出现蓝屏英文怎么办?查看修复过程

电脑出现蓝屏英文是一种常见的电脑故障&#xff0c;它通常表示电脑遇到了严重的错误&#xff0c;需要停止运行以防止进一步的损坏。电脑蓝屏英文的原因可能有很多&#xff0c;比如硬件故障、驱动程序错误、系统文件损坏、病毒感染等。那么&#xff0c;当电脑出现蓝屏英文时&…...

安卓基础(第一集)

SharedPreferences&#xff08;本地存储简单数据&#xff09; 在 Android 中&#xff0c;SharedPreferences 用于存储小型数据。 &#xff08;1&#xff09;存储数据 // 获取 SharedPreferences 对象 SharedPreferences sharedPreferences getSharedPreferences("MyPre…...

【从零开始入门unity游戏开发之——C#篇56】C#补充知识点——模式匹配

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...

【数据可视化-16】珍爱网上海注册者情况分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

c/c++蓝桥杯经典编程题100道(21)背包问题

背包问题 ->返回c/c蓝桥杯经典编程题100道-目录 目录 背包问题 一、题型解释 二、例题问题描述 三、C语言实现 解法1&#xff1a;0-1背包&#xff08;基础动态规划&#xff0c;难度★&#xff09; 解法2&#xff1a;0-1背包&#xff08;空间优化版&#xff0c;难度★…...

电赛DEEPSEEK

以下是针对竞赛题目的深度优化方案&#xff0c;重点解决频率接近时的滤波难题和相位测量精度问题&#xff1a; 以下是使用NI Multisim 14.3实现本项目的详细解决方案&#xff1a; 一、基础要求实现方案&#xff08;模块化设计&#xff09; 1. 双频信号发生电路 电路结构&…...

VSOMEIP ROUTING应用和CLIENT应用之间交互的消息

#define VSOMEIP_ASSIGN_CLIENT 0x00 // client应用请求分配client_id #define VSOMEIP_ASSIGN_CLIENT_ACK 0x01 // routing应用返回分配的client_id #define VSOMEIP_REGISTER_APPLICATION 0x02 // client应用注册someip应用 #…...

HTML之基本布局div|span

HTML基本布局使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"width<device-width>, initial-scale1.0"><title>布局</title> <…...

Linux下学【MySQL】常用函数助你成为数据库大师~(配sql+实操图+案例巩固 通俗易懂版~)

绪论​ 每日激励&#xff1a;“唯有努力&#xff0c;才能进步” 绪论​&#xff1a; 本章是MySQL中常见的函数&#xff0c;利用好函数能很大的帮助我们提高MySQL使用效率&#xff0c;也能很好处理一些情况&#xff0c;如字符串的拼接&#xff0c;字符串的获取&#xff0c;进制…...

【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列

目录 一.TTL ???1.设置消息的TTL 2.设置队列的TTL 3.俩者区别? 二.死信队列 定义&#xff1a; 消息成为死信的原因&#xff1a; 1.消息被拒绝&#xff08;basic.reject 或 basic.nack&#xff09; 2.消息过期&#xff08;TTL&#xff09; 3.队列达到最大长度? …...

机器学习赋能的智能光子学器件系统研究与应用

机器学习赋能的智能光子学器件系统研究与应用 时间&#xff1a; 2025年03月29日-03月30日 2025年04月05日-04月06日 机器学习赋能的光子学器件与系统&#xff1a;从创新设计到前沿应用 课程针对光子学方面的从业科研人员及开发者&#xff0c;希望了解和实践在集成光学/空间…...