劍指offer第2版:動態規劃+記憶化搜索

前三題是同一種模型,所以我分別用遞推、記憶化、動歸來做

一、p74-JZ10 斐波那契數列

斐波那契數列_牛客題霸_牛客網

class Solution {
public:int Fibonacci(int n) {// write code hereif(n==1||n==2) return 1;int a=1,b=1,c=1;while(n>2){c=a+b;a=b;b=c;--n;}return c;}
};

二、擴展p77-JZ10青蛙跳臺階

跳臺階_牛客題霸_牛客網

class Solution {
public://這題就用記憶化搜索int memory[41]={0};int jumpFloor(int n) {if(n<=2) return n;//考慮了1和2的情況//此時至少是n==3if(memory[n]) return memory[n];return memory[n]=jumpFloor(n-1)+jumpFloor(n-2);}
};

三、擴展p79-JZ10矩陣覆蓋

矩形覆蓋_牛客題霸_牛客網

class Solution {
public:int rectCover(int n) {if(n<=2) return n;vector<int> dp(n+1);dp[1]=1,dp[2]=2;for(int i=3;i<=n;++i) dp[i]=dp[i-1]+dp[i-2];//最后放豎的或者放倆正的return dp[n];}
};

四、擴展p78-JZ10青蛙跳臺階擴展問題

跳臺階擴展問題_牛客題霸_牛客網

?動態規劃:

//f[n]=f[n-1]+f[n-2]……f[0]
//f[n-1]=f[n-2]+f[n-3]……f[0]
//根據歸納法得f[n]=2*f[n-1]

class Solution {
public:int jumpFloorII(int number) {//動歸 f[n]表示跳到n臺階一共有幾種跳法//f[n]=f[n-1]+f[n-2]……f[0]//f[n-1]=f[n-2]+f[n-3]……f[0]//根據歸納法得f[n]=2*f[n-1]vector<int> dp(number);dp[0]=1;for(int i=1;i<number;++i) dp[i]=dp[i-1]*2;return dp[number-1];}
};

遞歸:f[n]=2*f[n-1]我們找到了重復子問題

class Solution {
public:int jumpFloorII(int number) {//1或0都是1種if(number == 1)return 1;//f(n) = 2*f(n-1)return 2 * jumpFloorII(number - 1);}
};

數學規律:根據規律f[n]=2^(n-1) 直接用pow函數

class Solution {
public:int jumpFloorII(int number) {if(number == 1)return 1;return pow(2,number-1);}
};

?五、p124-JZ19 正則表達式匹配

正則表達式匹配__牛客網

?當p[j]==‘.’或者p[j]==s[i]? 那么dp[i][j]=dp[i-1][j-1]

當p[j]=='*'的時候,如果p[j-1]==‘.’ 那么dp[i][j-2]||dp[i-1][j-2]……??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果p[j-1]==s[i]?那么dp[i][j-2]||dp[i-1][j-2]||……

//我們可以當*不匹配就是dp[i][j-2] ,或者是*匹配一個然后保留dp[i-1][j]?

class Solution {public:bool match(string s, string p) {//dp[i][j]表示p[0,j]的子串能否匹配s[0,i]的子串int m=s.size(), n= p.size();vector<vector<bool>> dp(m+1,vector<bool>(n+1));s=' '+s,p=' '+p; //為了方便下標的對應//分析邊界 *可以和前一個組成空串dp[0][0]=true;for(int j=2;j<=n;j+=2) if(p[j]=='*')dp[0][j]=true; else break;//當p[j]==s[i]||p[j]=='.' dp[i][j]=dp[i-1][j-1]//當p[j]=='*' 此時他可以匹配空,也可以匹配前1個、前兩個相同的//*如果啥也不匹配 dp[i][j-2]  或者是干掉一個然后保留dp[i-1][j]for (int i=1;i<=m;++i)for (int j=1;j<=n;++j)if (p[j]=='*')dp[i][j]=dp[i][j-2]||(p[j-1]==s[i]||p[j-1]=='.')&&dp[i-1][j];else dp[i][j]=(s[i]==p[j]||p[j]=='.')&&dp[i-1][j-1];return dp[m][n];}};

六、p218-JZ42連續子數組的最大和

連續子數組最大和_牛客題霸_牛客網

dp[i]表示以i位置為結尾時的最大子數組和?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {int n;cin>>n;vector<int> nums(n),dp(n);for(int i=0;i<n;++i) cin>>nums[i];dp[0]=nums[0];for(int i=1;i<n;++i) dp[i]=max(dp[i-1]+nums[i],nums[i]);cout<<*max_element(dp.begin(),dp.end())<<endl;
}

七、擴展p218-JZ42 連續子數組的最大和(二)

連續子數組的最大和(二)_牛客題霸_牛客網

?與上一題的區別在于我們不僅要統計最大的子數組和,還需要盡量選擇最長的,而且還要把他們全都插入到數組里返回(需要記錄區間)?

class Solution {
public:vector<int> FindGreatestSumOfSubArray(vector<int>& nums) {//連續子數組的最大和  dp[i]表示以i位置為結尾的最大和子數組int n=nums.size();vector<int> dp(n);dp[0]=nums[0];int begin=0;//標記起始位置和i做一段區間int left=0,right=0;//標記最長的區間int maxsum=nums[0];//記錄最大和for(int i=1;i<n;++i){dp[i]=max(nums[i],dp[i-1]+nums[i]);if(nums[i]+dp[i-1]<nums[i]) begin=i;//更新新的起點if(dp[i]>maxsum||dp[i]==maxsum&&(right-left+1)<(i-begin+1)){maxsum=dp[i];left=begin;right=i;}}vector<int> ret;ret.reserve(right-left+1);for(int i=left;i<=right;++i) ret.emplace_back(nums[i]);return ret;}
};

八、p231-JZ46 把數字翻譯成字符串

?把數字翻譯成字符串_牛客題霸_牛客網

//有s[i]單獨編碼的時候 ?dp[i]+=dp[i-1]
//當s[i]和s[i-1]一起編碼的時候 dp[i]+=dp[i-2]?

class Solution {
public:int solve(string nums) {//dp[i]表示以i位置為結尾時一共有多少種編碼的可能性//有s[i]單獨編碼的時候  dp[i]+=dp[i-1]//當s[i]和s[i-1]一起編碼的時候 dp[i]+=dp[i-2]if(nums=="0") return 0;int n=nums.size();nums=' '+nums;vector<int> dp(n+1);dp[0]=1;//其實沒有意義,是為了確保填表的正確dp[1]=(nums[1]!='0');for(int i=2;i<=n;++i){if(nums[i]!='0') dp[i]+=dp[i-1];int val=(nums[i-1]-'0')*10+nums[i]-'0';if(10<=val&&val<=26) dp[i]+=dp[i-2];}return dp[n];}
};

九、p233-JZ47 禮物的最大價值

禮物的最大價值_牛客題霸_牛客網

動態規劃?

class Solution {
public:int maxValue(vector<vector<int> >& nums) {int m=nums.size(),n=nums[0].size();//dp[i][j]表示從i j位置選了之后的最大價值vector<vector<int>> dp(m+1,vector<int>(n+1));for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)dp[i][j]=max(dp[i-1][j],dp[i][j-1])+nums[i-1][j-1];return dp[m][n];}
};

?記憶化搜索

class Solution {
public:int m,n;int maxValue(vector<vector<int> >& nums) {m=nums.size(),n=nums[0].size();//dp[i][j]表示從i j位置選了之后的最大價值vector<vector<int>> memory(m,vector<int>(n));return dfs(nums,m-1,n-1,memory);//統計最大價值}int dfs(vector<vector<int> >& nums,int i,int j,vector<vector<int> >& memory){if(i==0&&j==0) return nums[0][0];//到達了起點if(memory[i][j]) return memory[i][j];if(i==0) return memory[0][j]=nums[0][j]+dfs(nums,0,j-1,memory);if(j==0) return memory[i][0]=nums[i][0]+dfs(nums,i-1,0,memory);return memory[i][j]=nums[i][j]+max(dfs(nums,i-1,j,memory),dfs(nums,i,j-1,memory));}
};

十、p312-JZ66 構建乘積數組

?構建乘積數組_牛客題霸_牛客網

使用前綴積和后綴積數組? 然后構建結果集?

    vector<int> multiply(vector<int>& nums) {//前綴積和后綴積問題int n=nums.size();if(n==1) return {};vector<int> ret(n);vector<int> dpq(n,1);vector<int> dph(n,1);//前綴積for(int i=1;i<n;++i) dpq[i]=dpq[i-1]*nums[i-1];//后綴積for(int i=n-2;i>=0;--i) dph[i]=dph[i+1]*nums[i+1];//搞結果集for(int i=0;i<n;++i) ret[i]=dpq[i]*dph[i];return ret;}
};

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

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

相關文章

Unity 調節 Rigidbody2D 響應速度的解決方案【資料】

可以通過多種方式調節 Unity 中 Rigidbody2D 的響應速度&#xff0c;包括降低物理更新頻率、屏蔽過小值以及優化物理參數。以下是幾種有效的實現方法&#xff1a;1. 降低物理更新頻率&#xff08;不推薦直接修改&#xff09;雖然可以修改 Time.fixedDeltaTime 來降低物理更新頻…

力扣-189.輪轉數組

題目鏈接 189.輪轉數組 class Solution {public void reverse(int[] nums, int i, int j) {while (i < j && i > 0 && j < nums.length) {int temp nums[i];nums[i] nums[j];nums[j] temp;i;j--;}}public void rotate(int[] nums, int k) {k k …

Linux命令行安裝Climate Data Operators(CDO)的方法

本文介紹在Linux操作系統的發行版本Ubuntu中&#xff0c;基于命令行&#xff0c;配置Climate Data Operators&#xff08;CDO&#xff09;這個用于操作、分析氣候及其他相關數據的命令行工具的方法。 最近&#xff0c;需要對一批.nc格式文件加以處理&#xff1b;在之前&#xf…

如何為您的服務器選擇正確的 PHP 版本

PHP作為最流行的服務器端腳本語言之一&#xff0c;持續演進并定期發布新版本。為您的服務器選擇正確的PHP版本對于網站性能、安全性和功能兼容性至關重要。本文將指導您如何做出明智的選擇。了解PHP版本的生命周期在選擇PHP版本前&#xff0c;首先需要了解PHP的版本支持政策&am…

從0開始的中后臺管理系統-5(userList動態展示以及上傳圖片和彈出創建用戶表單)

項目用的都是antd組件&#xff0c;這里的userList組件展示的表單組件的數據直接get請求拿過來展示的&#xff0c;這里隨機生成了50個用戶只是為了展示表單的api設置。首先就是表單展示需要兩個參數current和pageSize兩個屬性控制表單的最大分頁和當前頁面。那么我們就設置初始值…

Spring MVC REST API設計詳解:從零構建高效接口

1. Spring MVC與REST API基礎1.1 RESTful架構的六大約束詳解RESTful架構是Roy Thomas Fielding在2000年博士論文中提出的軟件架構風格&#xff0c;它包含六個核心約束&#xff0c;這些約束共同構成了RESTful API的設計原則。客戶端-服務器約束&#xff08;Client-Server&#x…

基于STM32F030C8T6單片機實現與CH224Q誘騙芯片的I2C通信和電壓輸出配置

基于項目的需要,對STM32F030的IIC研究了幾天,終于完成了通信,接下來具體實現如下: 本單片機使用的是PB8和PB9管腳進行實現,采用的是模擬的IIC進行 void MyI2C_W_SCL(uint8_t BitValue)//這三個函數將讀寫io口封裝起來,增強可讀性 { GPIO_WriteBit(GPIOB, GPIO_Pin_8…

TSMaster-C小程序使用

打開同星的TSMaster&#xff0c;推薦用32版本的&#xff0c;比64更穩定。同星的TSMaster的C小程序支持用戶嵌入代碼來控制CAN報文的收發邏輯。便于開發。點擊設計里面的C小程序。 比如我現在想用小程序來實現繼電器0先開后關開1s關1s&#xff0c;然后繼電器1開1s關1s…如此往復…

XSS滲透測試原理/步驟/攻擊方法/防御/常用語法

**核心概念回顧&#xff1a;**XSS漏洞一直被評估為web漏洞中危害較大的漏洞&#xff0c;在OWASP TOP10的排名中一直屬于前三的江湖地位。XSS是一種發生在前端瀏覽器端的漏洞&#xff0c;所以其危害的對象也是前端用戶。 形成XSS漏洞的主要原因是程序對輸入和輸出沒有做合適的處…

目標檢測數據集 - 自動駕駛場景道路異常檢測數據集下載「包含VOC、COCO、YOLO三種格式」

數據集介紹&#xff1a;自動駕駛場景道路異常檢測數據集&#xff0c;真實場景高質量道路圖片數據&#xff0c;涉及場景豐富&#xff0c;且類別豐富&#xff0c;劃分為 "LMVs 輕型機動車&#xff08;汽車、摩托車、小型卡車、小型貨車"、"HMVs 公交車、卡車、拖拉…

多模態新方向|從數據融合到場景落地,解鎖視覺感知新范式

來gongzhonghao【圖靈學術計算機論文輔導】&#xff0c;快速拿捏更多計算機SCI/CCF發文資訊&#xff5e;多模態學習&#xff08;Multimodal Learning&#xff09;是通過整合多種數據模態來提升模型對復雜場景感知與理解能力的技術&#xff0c;其核心是利用不同模態的互補性突破…

機器學習之隨機森林

目錄 一、什么是隨機森林&#xff1f; 1. 從決策樹到集成學習&#xff1a;為什么需要 "森林"&#xff1f; 2.什么是集成學習 二、隨機森林的工作原理 三、隨機森林構造過程 四、隨機森林api介紹 五、隨機森林的優缺點 六、垃圾郵件判斷案例 1.數據集介紹 ?…

云平臺運維工具 —— 阿里云原生工具

一、簡介阿里云作為國內領先的云服務提供商&#xff0c;擁有一套完整的原生運維工具體系&#xff0c;這些工具與阿里云的各類服務深度融合&#xff0c;能夠滿足用戶在資源部署、監控告警、權限管理、自動化運維等方面的需求。無論是簡單的應用托管還是復雜的企業級架構&#xf…

Linux-Day10.系統安全保護web服務管理

今日目標&#xff1a;- 日志管理- 系統安全保護 SELinux&#xff08;重點&#xff09;- 構建基本web服務&#xff08;重點&#xff09;環境準備還原快照網絡配置完成&#xff0c;開啟虛擬機A與虛擬機B用真機連通虛擬機去操作&#xff0c;準本好Xshell一、常用的網絡工具ip命令1…

解決:開啟魔法后vscode pip命令不能安裝中科大python鏡像問題

閑言少敘&#xff0c;最終實現效果就是在開啟魔法情況下&#xff0c;vscode命令行任何能通過中科大python鏡像安裝第三方庫&#xff0c;又快又不消耗魔法流量。簡單來說就兩步&#x1f447;&#xff1a; 第一步&#xff1a;配置 pip.ini 中的代理 找到或創建 pip.ini 文件&…

優化Google Pubsub到GCS的文件整合策略

引言 在使用Google Cloud Platform (GCP) 的Pubsub服務時,我們常常會遇到將消息存儲到Google Cloud Storage (GCS) 作為Avro文件的問題。本文將深入探討如何優化Google Pubsub到GCS的文件整合策略,以避免每個消息都單獨生成一個Avro文件,達到將多個消息整合到一個文件的目的…

基于鐵頭山羊STM32的平衡車電機轉速開環閉環matlab仿真

基于鐵頭山羊STM32的平衡車電機轉速開環閉環matlab仿真前言一、電機開環傳遞函數1.1 電機開環傳遞函數的零極點1.2 求系統的參數和繪制波特圖二、增加PI控制器后系統開環傳遞函數三、電機系統閉環傳遞函數四、simulink仿真五、幅值裕度、相位裕度、相位穿越頻率和截止頻率&…

P1044 [NOIP 2003 普及組] 棧

P1044 [NOIP 2003 普及組] 棧 - 洛谷 題解來自洛谷題解&#xff0c;做筆記用 假設用一個函數來表示&#xff1a; x表示當前還未入棧的數字個數 y表示當前棧中的數字個數 orz&#xff0c;大佬們真的是很厲害&#xff0c;想著遞推但是只拿了60分 #include <bits/stdc.h&g…

linux mysql 8.X主從復制

準備兩臺linux服務器,注意要鎖ip我這里如上圖 主庫 192.168.5.5/24 從庫 192.168.5.10/24 接下來確定mysql是否啟動成功并且能從外部連接 主庫從庫主服務器配置 vim編輯主服務器配置 vim /etc/my.cnf注意是下面那個添加配置代碼 log-binmysql-bin # 配置二進制日志 server-id1…

豆包新模型矩陣+PromptPilot:AI開發效率革命的終極方案

> **一套讓AI開發者告別“調參煉獄”的黃金組合,效率提升300%的實戰指南** ## 一、AI開發的范式轉移:從通用模型到**場景化矩陣** 2025年,AI應用開發面臨核心矛盾:**業務場景高度細分**與**模型能力同質化**的沖突。火山引擎的破局之道是推出**豆包1.6模型矩陣**——三…