Hot100 動態規劃

動態規劃

動規五部曲:

  1. 確定dp數組以及下標的含義
  2. 確定遞推公式
  3. dp數組如何初始化
  4. 確定遍歷順序
  5. 舉例推導dp數組

70. 爬樓梯 - 力扣(LeetCode)

爬到第一層樓梯有一種方法,爬到二層樓梯有兩種方法。

那么第一層樓梯再跨兩步就到第三層 ,第二層樓梯再跨一步就到第三層。

所以到第三層樓梯的狀態可以由第二層樓梯 和 到第一層樓梯狀態推導出來,那么就可以想到動態規劃了。

我們來分析一下,動規五部曲:

定義一個一維數組來記錄不同樓層的狀態

  1. 確定dp數組以及下標的含義

dp[i]: 爬到第i層樓梯,有dp[i]種方法

  1. 確定遞推公式

如何可以推出dp[i]呢?

從dp[i]的定義可以看出,dp[i] 可以有兩個方向推出來。

首先是dp[i - 1],上i-1層樓梯,有dp[i - 1]種方法,那么再一步跳一個臺階不就是dp[i]了么。

還有就是dp[i - 2],上i-2層樓梯,有dp[i - 2]種方法,那么再一步跳兩個臺階不就是dp[i]了么。

那么dp[i]就是 dp[i - 1]與dp[i - 2]之和!

所以dp[i] = dp[i - 1] + dp[i - 2] 。

在推導dp[i]的時候,一定要時刻想著dp[i]的定義,否則容易跑偏。

class Solution {public int climbStairs(int n) {if(n==1||n==2) return n;int[] dp=new int[n+1];dp[0]=1;dp[1]=1;//dp[2]應該是2dp[2]=2;for(int i=3;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}return dp[n];}
}

746. 使用最小花費爬樓梯 - 力扣(LeetCode)

題目沒說明白,腦殘的很

class Solution {public int minCostClimbingStairs(int[] cost) {//這個題他爹的有毛病 cost的長度是n 但是樓梯下標要到n 長度為n+1 if(cost.length==2) return Math.min(cost[0],cost[1]);//只有1極樓梯int n=cost.length;//dp表示到達此處的最小花費int[] dp=new int[n+1];dp[0]=0;dp[1]=0;//因為可以選擇從0或者1出發for(int i=2;i<=n;i++){dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}return dp[n];}
}

?63. 不同路徑 II - 力扣(LeetCode)

和62不同路徑一樣 先初始化橫豎兩排,然后判斷一下有障礙的地方dp就是0

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m=obstacleGrid.length;int n=obstacleGrid[0].length;int[][] dp=new int[m][n];//如果第一行或第一列中存在障礙物,那么障礙物之后的路徑數量應該是0,而不是1。for(int i=0;i<obstacleGrid.length;i++){if(obstacleGrid[i][0]==0){dp[i][0]=1;}else{break;}}for(int j=0;j<obstacleGrid[0].length;j++){if(obstacleGrid[0][j]==0){dp[0][j]=1;}else{break;}}for(int i=1;i<m;i++){for(int j=1;j<n;j++){if(obstacleGrid[i][j]!=1){dp[i][j]=dp[i-1][j]+dp[i][j-1];}else{dp[i][j]=0;}}}return dp[m-1][n-1];}
}

?

?118. 楊輝三角 - 力扣(LeetCode)

class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> res=new ArrayList<>();res.add(List.of(1));for(int i=1;i<numRows;i++){List<Integer> row=new ArrayList<>(i+1);//i+1是元素數量//第一個是1row.add(1);for (int j = 1; j < i; j++) {// 左上方的數 + 正上方的數row.add(res.get(i - 1).get(j - 1) + res.get(i - 1).get(j));}//最后一豎是1row.add(1);res.add(row);}return res;}
}

**343. 整數拆分 - 力扣(LeetCode)?

class Solution {public int integerBreak(int n) {//dp[i] 為正整數 i 拆分后的結果的最大乘積int[] dp = new int[n+1];dp[1]=1;dp[2]=1;for(int i = 3; i <= n; i++) {for(int j = 1; j < i;j++) {//如果在比較最大值的時候不包括dp[i],那有可能越比越小,倒把一開始找到的最大值給弄丟了dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));// j * (i - j) 是單純的把整數 i 拆分為兩個數 也就是 i,i-j ,再相乘//而j * dp[i - j]是將 i 拆分成兩個以及兩個以上的個數,再相乘。}}return dp[n];}
}

?

?198. 打家劫舍 - 力扣(LeetCode)

動態規劃的的四個解題步驟是:

  • 定義子問題
  • 寫出子問題的遞推關系
  • 確定 DP 數組的計算順序
  • 空間優化(可選)
class Solution {public int rob(int[] nums) {if(nums.length==1) return nums[0];if(nums.length==2) return Math.max(nums[0],nums[1]);//只有兩種狀態 偷竊或者不偷竊int[] dp=new int[nums.length];//表示兩種狀態中最大獲利dp[0]=nums[0];//    dp[1]=nums[1];不對哦dp[1]=Math.max(dp[0],nums[1]);//列出狀態轉移方程for(int i=2;i<nums.length;i++){dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);}return dp[nums.length-1];}
}

首先「完全平方數」有無限個,但要湊成的數字是給定的。

所以首先把所有可能用到的「物品」預處理出來。

從而將問題轉換為:給定了若干個數字,每個數字可以被使用無限次,求湊出目標值n所需要用到的是最少數字個數是多少。

152. 乘積最大子數組 - 力扣(LeetCode)

class Solution {public int maxProduct(int[] nums) {int max = Integer.MIN_VALUE, imax = 1, imin = 1;for(int i=0; i<nums.length; i++){if(nums[i] < 0){ 
//由于存在負數,那么會導致最大的變最小的,最小的變最大的。因此還需要維護當前最小值imin 
//在出現負數這種危機關頭計算最大最小int tmp = imax;imax = imin;imin = tmp;}imax = Math.max(imax*nums[i], nums[i]);//一旦前面有負數就放棄曾經的一切imin = Math.min(imin*nums[i], nums[i]);max = Math.max(max, imax);}return max;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71705.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rust語言基礎知識詳解【一】

1.在windows上安裝Rust Windows 上安裝 Rust 需要有 C 環境&#xff0c;以下為安裝的兩種方式&#xff1a; 1. x86_64-pc-windows-msvc&#xff08;官方推薦&#xff09; 先安裝 Microsoft C Build Tools&#xff0c;勾選安裝 C 環境即可。安裝時可自行修改緩存路徑與安裝路…

文章精讀篇——OMG-Seg

題目&#xff1a;OMG-Seg : Is One Model Good Enough For All Segmentation? 作者&#xff1a;Xiangtai Li1 ? Haobo Yuan1 Wei Li1 Henghui Ding1 Size Wu1 Wenwei Zhang1Yining Li2 Kai Chen2 Chen Change Loy1 代碼&#xff1a;OMG-Seg 會議&#xff1a;cvpr2024 邊讀…

vite 開啟 gzip壓縮

使用vite 如何開啟 gzip壓縮 文章目錄 使用vite 如何開啟 gzip壓縮1. 引言為什么需要 Gzip 壓縮&#xff1f;Gzip 壓縮的作用 2. Vite 項目中的 Gzip 壓縮Vite 的基本概念Gzip 壓縮的原理 3. 使用 Vite 插件開啟 Gzip 壓縮安裝 vite-plugin-compression配置 vite-plugin-compre…

【Qt學習】| 如何使用QVariant存儲自定義類型

QVariant是Qt框架中的一個通用數據類型&#xff0c;可以存儲多種類型的數據&#xff0c;主要作用是提供一種類型安全的方式來存儲和傳遞不同類型的數據&#xff0c;而不需要顯示地指定數據類型。 QVariant提供了諸多構造函數可以非常方便地對基礎數據類型&#xff08;如&#x…

【Python量化金融實戰】-第1章:Python量化金融概述:1.4 開發環境搭建:Jupyter Notebook、VS Code、PyCharm

在量化金融開發中&#xff0c;選擇合適的開發環境至關重要。本章介紹三種主流工具&#xff1a;Jupyter Notebook&#xff08;交互式分析&#xff09;、VS Code&#xff08;輕量級編輯器&#xff09;、PyCharm&#xff08;專業IDE&#xff09;&#xff0c;并通過實戰案例展示其應…

查看 nginx 是否已經啟動

在 Ubuntu 或其他 Linux 系統上&#xff0c;要查看 Nginx 是否已經啟動&#xff0c;您可以使用以下幾種方法之一&#xff1a; 方法一&#xff1a;使用 systemctl 命令 Nginx 通常作為 systemd 服務運行&#xff0c;因此您可以使用 systemctl 命令來檢查其狀態。 打開終端。 …

解釋 Vue 中的虛擬 DOM,如何通過 Diff 算法最小化真實 DOM 更新次數?

1. 虛擬DOM核心原理&#xff08;附代碼示例&#xff09; // 簡化的VNode結構示意 class VNode {constructor(tag, data, children) {this.tag tag // 標簽名this.data data // 屬性/指令等this.children children // 子節點數組} }// 兩個新舊虛擬節點樹示例 const oldV…

Pytorch使用手冊-音頻數據增強(專題二十)

音頻數據增強 torchaudio 提供了多種方式來增強音頻數據。 在本教程中,我們將介紹一種應用效果、濾波器、RIR(房間脈沖響應)和編解碼器的方法。 最后,我們將從干凈的語音合成帶噪聲的電話語音。 import torch import torchaudio import torchaudio.functional as Fprin…

Linux-Ansible模塊擴展

文章目錄 Archive UnarchiveSetup模塊Lineinfile Replace &#x1f3e1;作者主頁&#xff1a;點擊&#xff01; &#x1f916;Linux專欄&#xff1a;點擊&#xff01; ??創作時間&#xff1a;2025年02月23日18點11分 Archive Unarchive Archive和Unarchive模塊 需求&#x…

Redhat及其衍生系統安裝python

目錄 更新包列表 安裝 Python 3 安裝特定版本的 Python 驗證安裝 安裝 pip 更新包列表 在安裝任何軟件之前&#xff0c;建議先更新系統的包列表&#xff0c;以確保安裝的是最新版本的軟件包&#xff1a; sudo dnf update 安裝 Python 3 RHEL 9 默認安裝了 Python 3&…

Python條件控制和循環語句

目錄 條件控制語句 1. if 語句 2. if-else 語句 3. if-elif-else 語句 循環語句 1. for 循環 2. while 循環 循環控制語句 1. break 語句 2. continue 語句 3. else 子句&#xff08;與循環結合&#xff09; 嵌套循環 常見應用場景 條件控制 循環語句 條件控制語…

*PyCharm 安裝教程

PyCharm 安裝教程&#xff0c;適用于 Windows、macOS 和 Linux 系統&#xff1a; 1. 下載 PyCharm 官網地址&#xff1a;https://www.jetbrains.com/pycharm/版本選擇&#xff1a; Community&#xff08;社區版&#xff09;&#xff1a;免費&#xff0c;適合基礎 Python 開發…

Three.js 快速入門教程【二】透視投影相機

系列文章目錄 系列文章目錄 Three.js 快速入門教程【一】開啟你的 3D Web 開發之旅 Three.js 快速入門教程【二】透視投影相機 Three.js 快速入門教程【三】渲染器 Three.js 快速入門教程【四】三維坐標系 Three.js 快速入門教程【五】動畫渲染循環 Three.js 快速入門教程【六…

IntelliJ IDEA 控制臺輸出中文出現亂碼

IntelliJ IDEA 控制臺輸出中文出現亂碼通常是由于編碼設置不一致導致的。以下是常見原因及解決方法 1. 項目編碼設置 檢查路徑&#xff1a;File → Settings → Editor → File Encodings 確保 Project Encoding、Global Encoding 和 Default Encoding for Properties Files 均…

C#初級教程(7)——初級期末檢測

練習 1&#xff1a;計算圓的周長和面積 改編題目&#xff1a;編寫一個 C# 程序&#xff0c;讓用戶輸入圓的半徑&#xff0c;然后計算并輸出該圓的周長和面積&#xff0c;結果保留兩位小數。 using System;class CircleCalculation {static void Main(){const double pi 3.14…

Java 集合:單列集合和雙列集合的深度剖析

引言 在 Java 編程中&#xff0c;集合是一個非常重要的概念。它就像是一個容器&#xff0c;能夠存儲多個數據元素&#xff0c;幫助我們更方便地管理和操作數據。Java 集合框架主要分為單列集合和雙列集合兩大類&#xff0c;它們各自有著獨特的特點和適用場景。接下來&#xff0…

layui 遠程搜索下拉選擇組件(多選)

模板使用&#xff08;lay-module/searchSelect&#xff09;&#xff0c;依賴于 jquery、layui.dist 中的 dropdown 模塊實現&#xff08;所以data 格式請參照 layui文檔&#xff09; <link rel"stylesheet" href"layui-v2.5.6/dist/css/layui.css" /&g…

通俗易懂的DOM1級標準介紹

前言 在前端開發中&#xff0c;DOM&#xff08;文檔對象模型&#xff09;是我們操作網頁內容的核心工具。前面的文章我們介紹了DOM0級、DOM2級事件模型&#xff0c;沒有DOM1級事件模型這種概念&#xff0c;但有DOM1級標準。今天我們就來討論DOM1級標準&#xff0c;看看它到底做…

python~http的請求參數中攜帶map

背景 調試 http GET請求的 map 參數&#xff0c;鏈路攜帶參數一直有問題&#xff0c;最終采用如下方式攜帶map 解決 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…

(java/Spring boot)使用火山引擎官方推薦方法向大模型發送請求

首先在maven里面引入官方依賴 <dependency><groupId>com.volcengine</groupId><artifactId>volcengine-java-sdk-ark-runtime</artifactId><version>LATEST</version></dependency>然后我們編寫測試類 package com.volcengin…