前言
這一道題不太難,怎麼表現呢?
告訴你吧,萌新寫的代碼長度25行。
直入主題
首先呢,我在這裏先不直接講最強大的二維DP,
先從四維開始吧:
基礎:
四維DP,時間、空間複雜度都爲 O(n4)
用f[i][j][x][y]表示
第一張紙條傳到(i,j),
第二張紙條傳到(x,y)
它們累計下來的好心程度和。
對於每一步呢,分別有四種情況:
1.第一張紙條向下傳,第二張紙條向下傳;
2.第一張紙條向下傳,第二張紙條向右傳;
3.第一張紙條向右傳,第二張紙條向下傳;
4.第一張紙條向右傳,第二張紙條向右傳;
F[i][j]=max(F[i-1][j][x-1][y] ,F[i-1][j][x][y-1] ,F[i][j-1][x-1][y] ,F[i][j-1][x][y-1])+a[i][j]+a[x][y];1
那麼如何判重呢?
其實可以不判,只要你想辦法使它沒有重複的情況就行了,
So for循環時我們限制y<x。
升級
三維DP,時間複雜度O(n3);空間複雜度多一倍;
我們可以發現每一張紙條每一步
要麼只走右邊,
要麼只走下邊,2
所以i+j=x+y;於是我們DP每一步的情況 3,
用i表示第一張紙往下走了多少步,因爲枚舉了k=i+j(就是走了多少步)所以可以用k-i來代替j;
第二張紙也同樣可以用k和x表示出來座標。因爲枚舉的是步數4所以呢,空間纔會多一倍。
於是 F[k][i][x]=max(F[k-1][i][x]+F[k-1][i][x-1]+F[k-1][i-1][x]+F[k-1][i-1][x-1]);
Boss進階:
最強大的二維DP,複雜度和三維一樣,但空間少了很多
如果你對揹包問題掌握得十分嫺熟,你就能用揹包思想來降維。怎麼做到的呢?
我們從三維DP的狀態轉移式中發現它只和上一步有關係,
並只牽扯到x,x-1,沒用到x+1;
所以我們從後向前推,這樣你現在用的二維數組就是上一步的,對x進行覆蓋也不會產生後效性。
Readers:這又如何去重呢?
Reply:其實和四維一樣,你只需要保證 x > i 就行啦,因爲這樣就不會有重複情況出現,自然也就不需要去重啦。
萌新求贊!