qbzt培訓整理系列之dp

2022-04-12 02:23:30 字數 3254 閱讀 2879

此系列並木有按照順序來,前面的有時間補上

跟我讀:咕咕咕

--------這裡是手動分割線----------

經典題之能量項鍊

變環為鏈,然後搞正常的區間\(dp\)

不過還有一種做法是設\(dp[i][len]\)表示從\(i\)往後推\(len\)個位置這一段合併的最大值

但本質都是一樣的

感覺難一點的矩陣取數遊戲

我們發現行與行之間的取數是互不影響的,也就是說每一行可以獨立處理

辣麼我們就獨立處理每一行的最大得分,最後相加就可以了

設\(f[i][j]\)表示當前行被取的只剩下\([i,j]\)的時候的最大得分

\(f[i][j]\)可以由\(f[i-1][j]\)和\(f[i][j+1]\)轉移而來,而且取走\(i-1\)或者是取走\(j+1\)時乘的數是固定的,為\(2^\)

\(\therefore f[i][j]=max\\times a[i-1],f[i][j+1]+2^\times a[j+1]\}\)

\(f[1][m]\)初始化為0,最大的\(f[i][i]+a[i]\times 2^m\)加入答案

飛揚的小鳥

設\(f[i][j]\)表示在點\((i,j)\)需要的最少點選次數

我們考慮是怎麼到達當前位置的:

1.在上一列點了一下飛進來的

2.在本列點了若干下飛上來的

3.上一列不點,掉下來的

其中2的情況也可以認為是在上一列點了若干下,飛上來的。在轉移的時候我們可以看做是先飛到\((i,j-x[i-1])\),再飛到\((i,j)\)

因為往上飛的次數是無限的,所以我們可以視作完全揹包,而往下掉只能有一次,所以往下掉就是01揹包

往上飛:\(f[i][j]=min\\)

處理在\((i,m)\)的情況:\(f[i][m]=min\,j\in [m-x[i-1],m]\)

往下掉:\(f[i][j]=min\\)

一些細節:被水管擋住的位置要在轉移完之後賦值為正無窮表示不可到達

其實最長公共子串行就是個匹配\(dp\)

子串這裡選出的子串雖然不可以重疊,但是它們可以相鄰

比如選出一串子串\(abb\)你可以說這是3個子串,也可以說是2個子串,還可以說是1個子串

我們模仿最長公共子串行,設\(f[i][j]\)表示\(a\)的前\(i\)位和\(b\)的前\(j\)位匹配的方案數

似乎少了點什麼.........

好像把\(k\)給忘了

如果考慮選出的子串個數,就要考慮\(a\)的第\(i\)位是否選

那麼設\(f[i][j][k][0/1]\)表示\(a\)的前\(i\)位中選出\(k\)個子串,其中第\(i\)位是/否在第\(k\)個子串中,與\(b\)的前\(j\)位匹配的方案數

考慮轉移

若\(a[i+1]!=b[j+1]\)

反正\(a[i+1]\)是不能塞進第\(k\)個子串裡了,那麼\(f[i+1][j][k][0]+=f[i][j][k][0]+f[i][j][k][1]\)

若\(a[i+1]==b[j+1]\)

選\(a[i+1]\):塞進第\(k\)個子串或者是新建乙個子串:

\(f[i+1][j+1][k][1]+=f[i][j][k][1]\)

\(f[i+1][j+1][k+1][1]+=f[i][j][k][1]+f[i][j][k][0]\)

不選\(a[i+1]\):

與不相等的情況相同,\(f[i+1][j][k][0]+=f[i][j][k][0]+f[i][j][k][1]\)

然後我們計算一下複雜度

時間複雜度:\(o(nmk)\),能苟住

空間複雜度:\(8\times 10^7\)

噫好空間炸了

於是我們把\(i\)這一維用滾動陣列滾掉

貨幣系統

看到這題,我們可以先來一波直(xia)覺(cai)推測:

\(b\)應該是\(a\)的子集叭

而且\(b\)裡面的元素應該是\(a\)中不能被除它自己以外的其他元素表達出來的元素,換句話說,就是把\(a\)能被重複表達的元素刪掉

那麼咱的直(xia)覺(cai)到底對不對呢

證一下叭

如果\(b\)中某一元素\(x\)不在\(a\)中:

如果\(x\)不能被\(a\)中的元素表達,則會\(x\)可表達\(a\)不能表達的新元素,不合題意

如果\(x\)可以被\(a\)中的元素表達,那麼表達\(x\)的元素一定比\(x\)小,這些元素可以組合出\(x\)所不能表達的更多元素,所以還是不合題意

\(\therefore b\)是\(a\)的子集

如果\(b\)中有可以被重複表達的元素,那麼刪掉之後\(m\)會更小,所以\(b\)是\(a\)把所有能被重複表達的元素刪掉之後的集合

辣麼我們就可以\(dp\)看看哪些元素會被重複表達了

設\(f[i]=0/1\)表示面值\(i\)能否被小於它的面值表達出

初始化:\(f[0]=1\),其餘為0

將\(a\)陣列從小到大排序,第一層列舉\(a[i]\),第二層列舉\(x\),\(f[x+a[i]]|=f[x]\)

樹網的核

(即消防弱化版)

然鵝資料被毒瘤地加到了1e6

也就是說消防的\(nlogn\)的做法也被卡掉了

真·毒瘤

這裡直徑上的每個點可以將樹分成若干個以直徑上的點為根的子樹,這樣就可以預處理出每個點分得的子樹的最長距離(樹形dp即可)

那麼直徑上每個點的點權可視作這個點分得的子樹的最長距離

我們要求的是選中的路徑上的點的點權+兩側距離的最大值最小

如果他不卡\(nlogn\)我們還可以二分對不對

但是他卡了

我們發現某個點到兩側的距離似乎可以\(o(1)\)求

而且根據直(xia)覺(cai),核的長度肯定是越接近\(s\)越優

辣麼就是不斷維護長度為\(s\)(或者接近\(s\))的路徑上的最大值,看看最小是多少

因為長度固定,所以我們可以單調佇列解決

to be continued

網路安全系列之培訓筆記整理

邏輯漏洞 多個執行緒競爭同乙個共享 變數 檔案等稱之為條件競爭。那麼什麼情況存在競爭條件?例項 上傳檔案,下面是乙個上傳檔案的例子,上傳檔案之前先校驗許可權 include include include define delay 10000 int main fp fopen fn,a fwrit...

打家劫舍系列DP之打家劫舍II

你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝...

學渣亂搞系列之dp斜率優化

學渣亂搞系列之dp斜率優化 by 狂徒歸來 下面看乙個例題print article。連續列印一段長達從i到j的的文章,需要m sigma sum j sum i 2的費用,求列印完這篇文章的最小費用。到底分多少次去列印,費用最低呢。dp i 表示列印從1.i的最小費用。那麼我們有dp轉移方程dp ...