0x50 動態規劃 傳紙條 線性DP

2021-09-12 14:33:58 字數 2015 閱讀 2266

給定乙個 n∗m

n*mn∗

m 的矩陣 a

aa,每個格仔中有乙個整數。現在需要找到兩條從左上角 (1,

1)

(1,1)

(1,1

) 到右下角 (n,

m)

(n,m)

(n,m

) 的路徑,路徑上的每一步只能向右或向下走。路徑經過的格仔中的數會被取走。兩條路徑不能經過同乙個格仔。求取得的數之和最大是多少。 n,m

≤50

。n,m\leq50。

n,m≤50

。 d pdp

dp問題,首先需要列一下狀態。對於此題,有乙個很直接的想法就是 dp[

x1][

y1][

x2][

y2

]dp[x1][y1][x2][y2]

dp[x1]

[y1]

[x2]

[y2]

表示第一條路徑走到 (x1

,y1)

(x1,y1)

(x1,y1

),第二條路徑走到 (x2

,y2)

(x2,y2)

(x2,y2

) 所能獲得的最大值。然後再用這個狀態去更新別的狀態。

對於這題來說,由於資料範圍比較小,因此到這裡也就可以結束了。但是如果有意卡空間的話,我們就需要進一步優化了。觀察當前的 dpdp

dp狀態,每一維是否達到了線性無關。我們可以發現兩條路徑在更新時,應該保持長度一致。因此我們可以發現 x1+

y1=x

2+y2

x1+y1=x2+y2

x1+y1=

x2+y

2,由此可以發現當前狀態並沒有達到線性無關,因此我們可以令 len

=x1+

y1=x

2+y2

len = x1+y1 = x2+y2

len=x1

+y1=

x2+y

2,狀態就變成了 dp[

len]

[x1]

[x2]

dp[len][x1][x2]

dp[len

][x1

][x2

],空間成功壓縮到了三維,即可完成優化。

#include

#include

#include

#include

#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)

#define rep(i,a,b) for(int i = a; i <= b; i++)

#define log1(x1,x2) cout << x1 << ": " << x2 << endl;

#define log2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;

typedef

long

long ll;

typedef

double db;

const db eps =

1e-9

;using

namespace std;

const

int n =50+

10;int n,m,c[n]

[n];

int dp[n]

[n][n]

[n];

bool

cmp(

int xx,

int yy)

void

solve

(int xx1,

int yy1,

int xx2,

int yy2,

int cc)

intmain()

printf

("%d\n"

,dp[n]

[m][n]

[m])

;return0;

}

選課 0x50 動態規劃 例題

學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了 n n 300 門的選修課程,每個學生可選課程的數量 m 是給定的。學生選修了這 m 門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其他的一些課程的...

0x50 動態規劃(練習)20 乾草堆(題解)

題目鏈結 題意 奶牛們討厭黑暗。為了調整牛棚頂的電燈的亮度,bessie必須建一座乾草堆使得她能夠爬上去夠到燈泡。一共有n大包的乾草 從1到n編號 依靠傳送帶連續的傳輸進牛棚來。第i包乾草有乙個寬度wi。所有的幹草包的厚度和高度都為1。bessie必須利用所有n包乾草來建立起乾草堆。她可以想放多少包...

《演算法競賽高階指南》0x51線性DP 傳紙條

題目要求 給乙個n m的矩陣,求從左上角到右下角的兩條路徑,使得兩條路徑上的值只和最大。從左上角往右下角走的時候只能向下或者向右。在這個問題中階段就是步數,步數與座標點的橫縱座標之和相差乙個常數,所以可以通過座標只和以及兩個點的橫座標來確定當前的狀態集合。此時通過乙個點的所有入邊更新乙個點即可。一共...