20250908 背包DP總結

引子

~ 我們都有一個家,名字叫背包 ~

背包DP

顧名思義,背包DP是用來解決背包最值問題的。題目會給出背包的容量,以及幾個物品的屬性,比如重量,價值,限額等等,具體是什么看題目。

01背包

01背包就是每個物品只能選擇拿還是不拿。怎么實現呢?我們設dp[i]dp[i]dp[i]表示當背包容量為iii是可以獲得的最值,那么答案就是dp[w]dp[w]dp[w],其中www代表背包容量。

首先,我們枚舉每一個物品,然后再枚舉背包容量,看目前的背包裝不裝的下這個物品,如果裝得下,那么用裝這個物品之前剩余的背包的容量的最值加上這個物品的價值更新目前的dp[j]dp[j]dp[j],動態轉移方程 dp[j]=max(dp[j],dp[j?w[i]]+q[i])dp[j]=max(dp[j],dp[j-w[i]]+q[i])dp[j]=max(dp[j],dp[j?w[i]]+q[i])

洛谷 P1048 采藥

辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞里對他說:“孩子,這個山洞里有一些不同的草藥,采每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間里,你可以采到一些草藥。如果你是一個聰明的孩子,你應該可以讓采到的草藥的總價值最大。”

如果你是辰辰,你能完成這個任務嗎?

當然不能啦01背包的模板,真沒啥好說的,動態轉移方程都出了。

時間復雜度O(nt)O(nt)O(nt)

#include<bits/stdc++.h>
using namespace std;
struct cy{int t,j;
}a[105];
int dp[1005];
int main(){int t,n;cin>>t>>n;for(int i=1;i<=n;i++){cin>>a[i].t>>a[i].j;}for(int i=1;i<=n;i++){for(int j=t;j>=0;j--){if(j>=a[i].t){dp[j]=max(dp[j],dp[j-a[i].t]+a[i].j);}}}cout<<dp[t];return 0;
}

完全背包

完全背包就是每個物品可以拿無數個。基本和01背包一致,只是背包容量要從小到大枚舉。為什么呢?

個人認為,從大到小枚舉,因為背包容量更大的只可能被背包容量更小的更新,而且是先更新背包容量更大的,所以一個物品只會被拿一次。

相反,從小到大枚舉,因為背包容量更小的可以更新背包容量更大的,而且是先更新背包容量更小的,所以一個物品會被拿很多次。

洛谷 P1616 瘋狂的采藥

LiYuxiang 是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞里對他說:“孩子,這個山洞里有一些不同種類的草藥,采每一種都需要一些時間,每一種也有它自身的價值。我會給你一段時間,在這段時間里,你可以采到一些草藥。如果你是一個聰明的孩子,你應該可以讓采到的草藥的總價值最大。”

如果你是 LiYuxiang,你能完成這個任務嗎?

此題和原題的不同點:

  1. 每種草藥可以無限制地瘋狂采摘。
  2. 藥的種類眼花繚亂,采藥時間好長好長啊!師傅等得菊花都謝了!

當然不能啦完全背包的模板,稍微注意一下要開long long。

時間復雜度O(nt)O(nt)O(nt)

#include<bits/stdc++.h>
using namespace std;
struct cy{long long t,j;
}a[10005];
long long b[10000005];
int main(){int t,n;cin>>t>>n;for(int i=1;i<=n;i++){cin>>a[i].t>>a[i].j;} for(int i=1;i<=n;i++){for(int j=0;j<=t;j++){if(j>=a[i].t){b[j]=max(b[j],b[j-a[i].t]+a[i].j);}}}cout<<b[t];return 0;
}

多重背包

多重背包就是第i個物品最多可以拿p[i]次,大小為w[i],價值為q[i]。一種做法,把多重背包轉換成01背包來寫。

首先枚舉每一個物品,然后從大到小枚舉背包容量,接著枚舉拿多少個這個物品,判斷目前的背包容量裝不裝的下這么多個物品,裝得下就用裝這幾個物品之前的最值加上這幾個物品的價值更新目前的dp。dp[j]=max(dp[j],dp[j?k?w[i]]+k?q[i]dp[j]=max(dp[j],dp[j-k*w[i]]+k*q[i]dp[j]=max(dp[j],dp[j?k?w[i]]+k?q[i]

但是,但是,時間復雜度就是O(VΣp[i])O(VΣp[i])O(VΣp[i])了,在一些題目里會超時。怎么辦呢?于是就有了二進制優化。

洛谷 P1776 寶物篩選

終于,破解了千年的難題。小 FF 找到了王室的寶物室,里面堆滿了無數價值連城的寶物。

這下小 FF 可發財了,嘎嘎。但是這里的寶物實在是太多了,小 FF 的采集車似乎裝不下那么多寶物。看來小 FF 只能含淚舍棄其中的一部分寶物了。

小 FF 對洞穴里的寶物進行了整理,他發現每樣寶物都有一件或者多件。他粗略估算了下每樣寶物的價值,之后開始了寶物篩選工作:小 FF 有一個最大載重為WWW 的采集車,洞穴里總共有nnn種寶物,每種寶物的價值為vi?v_i?vi??,重量為wiw_iwi??,每種寶物有mim_imi?件。小 FF 希望在采集車不超載的前提下,選擇一些寶物裝進采集車,使得它們的價值和最大。

多重背包加 二進制 or 單調隊列 優化即可。

時間復雜度O(nm)O(nm)O(nm)

#include<bits/stdc++.h>//二進制優化多重背包
using namespace std;
int dp[1000005],w[1000005],v[1000005],n,m,ans,cnt=1;
int main(){cin>>n>>m;for(int i=1;i<=n;i++){int a,b,c;cin>>a>>b>>c;for(int j=1;j<=c;j<<=1){v[++cnt]=j*a;w[cnt]=j*b;c-=j;}if(c){v[++cnt]=a*c;w[cnt]=b*c; }}for(int i=1;i<=cnt;i++){for(int j=m;j>=w[i];j--){dp[j]=max(dp[j],dp[j-w[i]]+v[i]);}        }cout<<dp[m];return 0;
}

混合背包

太恐怖了混合背包,每一個物品,它可以拿無數次或拿有限次。其實就是把前面三種背包捆起來,枚舉每個物品時判斷一下是可以拿無數次還是可以拿有限次,是無數次就用完全背包,是有限次就用多重背包。

洛谷 P1833 櫻花

愛與愁大神后院里種了nnn棵櫻花樹,每棵都有美學值Ci(0<Ci≤200)C_i(0<C_i≤200)Ci?(0<Ci?200)。愛與愁大神在每天上學前都會來賞花。愛與愁大神可是生物學霸,他懂得如何欣賞櫻花:一種櫻花樹看一遍過,一種櫻花樹最多看Pi(0≤Pi≤100)P_i(0≤P_i≤100)Pi?(0Pi?100)遍,一種櫻花樹可以看無數遍。但是看每棵櫻花樹都有一定的時間Ti(0<Ti≤100)T_i(0<T_i≤100)Ti?(0<Ti?100)。愛與愁大神離去上學的時間只剩下一小會兒了。求解看哪幾棵櫻花樹能使美學值最高且愛與愁大神能準時(或提早)去上學。

混合背包模板題,需要贅述嗎?

時間復雜度O(nt)O(nt)O(nt)

#include<bits/stdc++.h>
using namespace std;
struct node{int t,c,p;
}a[10005];
long long dp[1005];
int main(){string s1,s2;cin>>s1>>s2;int t1=0,t2=0,t3=0,t4=0;//這只是一些細節,可以直接跳過if(s1.size()==4){t1=s1[0]-48;t2=(s1[2]-48)*10+s1[3]-48;}else{t1=(s1[0]-48)*10+s1[1]-48;t2=(s1[3]-48)*10+s1[4]-48;}if(s2.size()==4){t3=s2[0]-48;t4=(s2[2]-48)*10+s2[3]-48;}else{t3=(s2[0]-48)*10+s2[1]-48;t4=(s2[3]-48)*10+s2[4]-48;}int t=(t3-t1)*60+(t4-t2),n;//到這才算真正開始cin>>n;for(int i=1;i<=n;i++){cin>>a[i].t>>a[i].c>>a[i].p;}for(int j=1;j<=n;j++){if(a[j].p==0){//如果可以拿無數次for(int i=1;i<=t;i++){//完全背包if(i>=a[j].t){dp[i]=max(dp[i],dp[i-a[j].t]+a[j].c);}}}else{//不然就只能拿有限次數for(int i=t;i>=1;i--){//多重背包for(int k=1;k<=a[j].p;k++){if(i>=k*a[j].t){dp[i]=max(dp[i],dp[i-k*a[j].t]+a[j].c*k);}}}            }}cout<<dp[t];return 0;
}

完結撒花就怪了。。。。。。

好多例題

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh……

咳咳,剛才有些腦抽了,巨佬別**……

洛谷 P1510 精衛填海

本題為改編題。

發鳩之山,其上多柘木。有鳥焉,其狀如烏,文首,白喙,赤足,名曰精衛,其名自詨。是炎帝之少女,名曰女娃。女娃游于東海,溺而不返,故為精衛。常銜西山之木石,以堙于東海。——《山海經》

精衛終于快把東海填平了!只剩下了最后的一小片區域了。同時,西山上的木石也已經不多了。精衛能把東海填平嗎?

事實上,東海未填平的區域還需要至少體積為 v 的木石才可以填平,而西山上的木石還剩下 n 塊,每塊的體積和把它銜到東海需要的體力分別為 k 和 m。精衛已經填海填了這么長時間了,她也很累了,她還剩下的體力為 c。

哇,01背包!看起來好高級啊!

千萬不要想復雜了,其實只要把狀態想清楚了就行了。我的做法是把dp[i]狀態設為體力為i時可以填補的最大體積,那么最后的答案就是 ccc 減去符合條件 v≤dp[i]v≤dp[i]vdp[i] 的最小 iii

時間復雜度O(nc)O(nc)O(nc)

#include<bits/stdc++.h>
using namespace std;
int k[10005],m[10005],dp[10005];
int main(){int u,n,c;cin>>u>>n>>c;for(int i=1;i<=n;i++){cin>>k[i]>>m[i];}for(int j=1;j<=n;j++){for(int i=c;i>=0;i--){if(m[j]<=i){dp[i]=max(dp[i],dp[i-m[j]]+k[j]);}}}if(dp[c]<u){cout<<"Impossible";}else if(dp[0]>=u){//可能只需要填0體積或有的木石所需體力為0cout<<c;}else{for(int i=1;i<=c;i++){if(dp[i]>=u){cout<<c-i;return 0;}}}return 0;
}

洛谷 P1455 搭配購買

明天就是母親節了,電腦組的小朋友們在忙碌的課業之余挖空心思想著該送什么禮物來表達自己的心意呢?聽說在某個網站上有賣云朵的,小朋友們決定一同前往去看看這種神奇的商品,這個店里有 n 朵云,云朵已經被老板編號為 1,2,3,…,n,并且每朵云都有一個價值。

但是商店的老板是個很奇怪的人,他會告訴你一些云朵要搭配起來買才賣,也就是說買一朵云則與這朵云有搭配的云都要買。電腦組的你覺得這禮物實在是太新奇了,但是你的錢是有限的,所以你肯定是想用現有的錢買到盡量多價值的云。

非常鬼畜的一道題,但并不難。首先題目告訴我們一些云朵必須一起買,相信你一定想到了并查集,沒錯,就是并查集!好吧,標簽上面就有……

首先我們設好并查集數組的初始值,然后接到m個搭配的時候用并查集函數找到這兩朵云的祖宗,然后讓他們認祖歸宗,完了之后看有幾個祖宗,用一個數組統計起來。

接下來就是強連通分量了,把每個祖宗相同的點連起來,看成一整個點,再用兩個數組記錄這幾個點的總價錢和總價值,然后就套上01背包模板即可得出答案。

時間復雜度O(cntw)O(cntw)O(cntw)

#include<bits/stdc++.h>
using namespace std;
int c[10005],d[10005],fa[10005],dp[10005];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);
}
int q[10005],g[10005],gp[10005];
int main(){int n,m,w;cin>>n>>m>>w;for(int i=1;i<=n;i++){cin>>c[i]>>d[i];fa[i]=i;}for(int i=1;i<=m;i++){int u,v;cin>>u>>v;u=find(u),v=find(v);if(u!=v){fa[u]=fa[v];}}for(int i=1;i<=n;i++){if(fa[i]==i){gp[++gp[0]]=i;}}for(int i=1;i<=n;i++){for(int j=1;j<=gp[0];j++){if(find(i)==gp[j]){q[j]+=c[i];g[j]+=d[i];}}}for(int j=1;j<=gp[0];j++){for(int i=w;i>=0;i--){if(i>=q[j]){dp[i]=max(dp[i],dp[i-q[j]]+g[j]);}}}cout<<dp[w];return 0;
}

CF189A Cut Ribbon

波利卡普有一條長度為n的絲帶。他想按照以下兩個條件切割這條絲帶:

  1. 切割后每段絲帶的長度必須是a、b或c
  2. 切割后的絲帶段數要盡可能多

請幫助波利卡普計算出滿足條件的切割方式下,最多能得到多少段絲帶。

別想著用分支結構,因為他最多可以分成4000段……

感覺好簡單哪,不就是完全背包嗎?我們設dp[i]為絲帶長度為i時可以分成的最多段數,那么答案就是dp[n]。

所謂物品,在這里就是a,b,c,把它分成幾段,就是拿幾個a,拿幾個b,拿幾個c,那么在枚舉絲帶長度時就可以看減去這一段是否可以分成若干個a,b,c,可以就用dp[i?a,b,c]+1dp[i-a,b,c]+1dp[i?a,b,c]+1更新dp[i]dp[i]dp[i]

時間復雜度O(n)O(n)O(n)

#include<bits/stdc++.h>
using namespace std;
long long dp[8005];
int main(){long long n,a,b,c;cin>>n>>a>>b>>c;if(b>c){//注意,為了使分的段數盡量的多,所以我們一定要從長度更小的開始 dpswap(b,c);}if(a>b){swap(a,b);}for(int i=1;i<=n;i++){if(i==a||(dp[i-a+n]&&i>=a)){dp[i+n]=max(dp[i+n],dp[i-a+n]+1);//左移戰術,百戰不殆!}if(i==b||(dp[i-b+n]&&i>=b)){dp[i+n]=max(dp[i+n],dp[i-b+n]+1);}if(i==c||(dp[i-c+n]&&i>=c)){dp[i+n]=max(dp[i+n],dp[i-c+n]+1);}}cout<<dp[n+n];return 0;
}

洛谷 P6771 [USACO05MAR] Space Elevator 太空電梯

奶牛們要去太空了!它們打算用方塊建造一座太空電梯。現在它們有 N 種方塊,第 i 種方塊有一個特定的高度 hih_ihi? ,一定的數量 cic_ici? 。為了防止宇宙射線破壞方塊,第 i 種方塊的任何部分不能超過高度 aia_iai? 。請用這些方塊堆出最高的太空電梯。

話說這些奶牛越來越獵奇了……

說白了就是個多重背包嘛,也就套了個太空電梯的殼子,不過這回dp是一個bool數組,也就是dp[i]表示是否可以達到高度 i ,那么當j>=k*h[i],狀態轉移方程:dp[j]∣=dp[j?k?a[i].h]dp[j] |=dp[j-k*a[i].h]dp[j]=dp[j?k?a[i].h]

時間復雜度O(nkΣa[i])O(nkΣa[i])O(nkΣa[i])

#include<bits/stdc++.h>
using namespace std;
struct node{int h,a,c;
}a[405];
bool cmp(node x,node y){return x.a<y.a;
}
bool dp[40005];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i].h>>a[i].a>>a[i].c;}sort(a+1,a+1+n,cmp);//排個序才能更優dp[0]=1;for(int i=1;i<=n;i++){for(int j=a[i].a;j>=a[i].h;j--){for(int k=1;k<=a[i].c;k++){if(j>=k*a[i].h){dp[j]|=dp[j-k*a[i].h];}}}}for(int i=a[n].a;i>=0;i--){if(dp[i]){cout<<i;return 0;}}return 0;
}

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

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

相關文章

Redis持久化之RDB:快照機制原理、配置與最佳實踐

Redis持久化之RDB&#xff1a;快照機制原理、配置與最佳實踐 1. RDB持久化概述 1.1 什么是RDB RDB&#xff08;Redis Database&#xff09;是Redis的默認持久化方式&#xff0c;它在指定的時間間隔內生成數據集的快照&#xff08;snapshot&#xff09;&#xff0c;并將快照保…

daily notes[44]

文章目錄基礎references基礎 hello,world是幾乎所有編程語言的第一例子&#xff0c;rust也不例外。但和其它語言不一樣&#xff0c;Rust的源碼最好擁有自己的項目目錄。 $ mkdir ~/pro $ cd ~/pro $ mkdir helloWorld $ cd helloWorld源代碼文件名為main.rs&#xff0c;內容如…

JavaScript對象創建方式完全指南:從原始到現代的演進之路

前言 作為一名前端開發者&#xff0c;JavaScript中對象創建是很重要。在JavaScript這門基于原型的語言中&#xff0c;對象幾乎無處不在。今天&#xff0c;我將帶領大家回顧JavaScript對象創建的7種方式&#xff0c;從最原始的字面量到現代的ES6 class&#xff0c;每一步演進都解…

基于單片機的無線水塔監控系統設計(論文+源碼)

本設計為基于單片機的無線水塔監控系統設計&#xff0c;主要由以下幾部分組成&#xff1a;均采用STC89C52RC單片機為主控&#xff1b;主機&#xff1a;NRF24L01無線通訊模塊&#xff0c;1602LCD液晶顯示屏。從機&#xff1a;NRF24L01無線通訊模塊&#xff0c;水位傳感器&#x…

凌晨0-3點不睡,你熬的不是夜,是人生!

“熬夜”這個詞&#xff0c;早已成為現代生活的常態。有人為了工作加班到深夜&#xff0c;有人為了娛樂刷劇到天明&#xff0c;但你知道嗎&#xff1f;熬夜最“要命”的時間段&#xff0c;其實是凌晨0點到凌晨3點。別以為只是少睡幾個小時而已&#xff0c;這個時間段不睡&#…

大語言模型基石:Transformer

一、引言 如今火爆的 GPT、LLaMA、通義千問、ChatGLM 等大語言模型&#xff0c;背后都離不開一個核心架構——Transformer。 2017 年&#xff0c;Google 在論文《Attention Is All You Need》中首次提出 Transformer 模型&#xff0c;徹底改變了自然語言處理的發展方向。它摒…

【算法】【鏈表】160.相交鏈表--通俗講解

算法通俗講解推薦閱讀 【算法–鏈表】83.刪除排序鏈表中的重復元素–通俗講解 【算法–鏈表】刪除排序鏈表中的重復元素 II–通俗講解 【算法–鏈表】86.分割鏈表–通俗講解 【算法】92.翻轉鏈表Ⅱ–通俗講解 【算法–鏈表】109.有序鏈表轉換二叉搜索樹–通俗講解 【算法–鏈表…

MySQL——庫的操作

1、創建數據庫語法&#xff1a;CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name這里的CHARACTER SET表示指定數據庫采用的字符集…

Python ast模塊(Abstract Syntax Trees,抽象語法樹)介紹及使用

文章目錄 核心概念 基本使用流程 常用節點類型 示例代碼 實際應用場景 注意事項 `ast.literal_eval()` 功能說明 適用場景 使用示例 限制與安全特性 與 `eval()` 的對比 總結 Python 的 ast 模塊( Abstract Syntax Trees,抽象語法樹)允許你解析、分析和修改 Python 代碼的…

C++寬度優先搜索算法:隊列與優先級隊列

本期我們就來深入學習一下C算法中一個很重要的算法思想&#xff1a;寬度優先搜索算法 寬度優先算法是一個應用十分廣泛的算法思想&#xff0c;涉及的領域也十分繁多&#xff0c;因此本篇我們先只涉獵它的一部分算法題&#xff1a;隊列/優先級隊列&#xff0c;后續我們會進一步地…

類的property屬性

??Python 中的 property 特性詳解??property 是 Python 中用于??將方法轉換為屬性??的裝飾器&#xff0c;它允許開發者以訪問屬性的方式調用方法&#xff0c;同時可以添加邏輯控制&#xff08;如數據校驗、計算屬性等&#xff09;。以下是其核心用法和優勢&#xff1a;…

【Redis#9】其他數據結構

引言 Redis 除了我們最常用的 String、Hash、List、Set、ZSet&#xff08;Sorted Set&#xff09; 這五種基本數據結構外&#xff0c;還提供了很多高級或特殊用途的數據結構/類型 &#xff0c;它們可以滿足更復雜的業務需求。 ? Redis 的“五大基本數據結構”回顧類型特點Stri…

AutoGen——自定義Agent

目錄引子自定義 AgentCountDownAgentArithmeticAgent在自定義 Agent 中使用自定義模型客戶端讓自定義 Agent 聲明式化Selector Group Chat示例&#xff1a;網頁搜索 / 數據分析代理&#xff08;Agents&#xff09;Workflow終止條件&#xff08;Termination Conditions&#xff…

【重定向和轉發的核心理解】

重定向和轉發 不廢話&#xff1a; “轉發” 的核心定義&#xff1a; 服務端內部主導跳轉、客戶端無感知&#xff08;僅 1 次請求&#xff09;、瀏覽器 URL 不改變&#xff0c;與傳統 Web 開發中 “轉發” 的本質邏輯完全一致&#xff0c;只是實現載體&#xff08;Nginx 路由層 …

生成對抗網絡詳解與實現

生成對抗網絡詳解與實現0. 前言1. GAN 原理2. GAN 架構3. 損失函數3.1 判別器損失3.2 生成器損失3.4 VANILLA GAN4. GAN 訓練步驟0. 前言 生成對抗網絡 (Generative Adversarial Network, GAN) 是圖像和視頻生成中的主要方法之一。在本節中&#xff0c;我們將了解 GAN 的架構、…

FPGA硬件開發-XPE工具的使用

目錄 XPE 工具概述? XPE 使用步驟詳解? 1. 工具獲取與初始化? 2. 器件選擇與配置? 3. 電源電壓設置? 4. 資源使用量配置? 5. 時鐘與開關活動配置? 6. 功耗計算與報告生成? 報告解讀與電源設計優化? 常見問題與最佳實踐? 與實際功耗的差異處理? 工具版本…

CentOS 7.9 RAID 10 實驗報告

文章目錄CentOS 7.9 RAID 10 實驗報告一、實驗概述1.1 實驗目的1.2 實驗環境1.3 實驗拓撲二、實驗準備2.1 磁盤準備2.2 安裝必要軟件三、RAID 10陣列創建3.1 創建RAID 10陣列3.2 創建文件系統并掛載3.3 保存RAID配置四、性能基準測試4.1 初始性能測試4.2 創建測試數據集五、故障…

機器人逆運動學進階:李代數、矩陣指數與旋轉流形計算

做機器人逆運動學&#xff08;IK&#xff09;的時候&#xff0c;你遲早會遇到矩陣指數和對數這些東西。為什么呢&#xff1f;因為計算三維旋轉的誤差&#xff0c;不能簡單地用歐氏距離那一套&#xff0c;那只對位置有效。旋轉得用另一套方法——你需要算兩個旋轉矩陣之間的差異…

計算機視覺(opencv)實戰十八——圖像透視轉換

圖像透視變換詳解與實戰在圖像處理中&#xff0c;透視變換&#xff08;Perspective Transform&#xff09; 是一種常見的幾何變換&#xff0c;用來將圖像中某個四邊形區域拉伸或壓縮&#xff0c;映射到一個矩形區域。常見應用場景包括&#xff1a;糾正拍照時的傾斜&#xff08;…